在我的工作场所中的并发代码中,有几个具有非零常数释放CPU而不依赖futex()或睡眠同步原语使线程休眠(例如,在等待并发队列中的元素时)。当其他线程可以在CPU上调度时,代码声称可以防止线程消耗CPU而不做任何实际工作的病态情况。假设睡眠函数和内核线程调度程序之间的协作是正确的,这本身听起来是合理的。
在linux中是否有这样一个概念,即将最小持续时间传递给nanosleep()、usleep()等。当内核被超额订阅时,已知会使调用线程处于休眠状态,并在同一核心位置上运行另一个线程吗?如果持续时间小于这一点,那么线程实际上不会产生CPU,而是继续旋转吗?这就形成了传递给the ()函数的常量的基础,以便使其表现得像粗产量。
我意识到sched_yield()可能更适合于代码所做的工作;但我只是想在对现有代码的替换或改进进行基准测试之前,先了解linux ()函数的行为。
谢谢!
发布于 2020-02-14 19:08:44
手册页面清楚地表明,它不再繁忙-等待。
为了支持需要更精确暂停的应用程序(例如,为了控制一些时间关键的硬件),纳秒睡眠(
())将处理高达2毫秒的暂停,当从实时策略(如SCHED_FIFO或SCHED_RR )调度的线程调用时,将以微秒的精度忙于等待。这个特殊的扩展在内核2.5.39中被删除,因此在Linux2.6.0和更高版本的内核中不可用。
发布于 2020-02-14 20:31:52
@斯塔克已经用书面的方式回答了你的问题,但要详细说明的是,没有这么做。如果您正在等待事件发生,则执行等待事件的操作,如pthread_cond_wait、sem_wait、poll、read等,而不是休眠和重试。这将避免浪费大量的cpu时间,还会阻止错误的编程模型(因为通常等待的原语也会确保独占访问/同步)。
https://stackoverflow.com/questions/60232117
复制相似问题