0

在多线程应用程序中,是

while (result->Status == Result::InProgress) Sleep(50);
//process results

好于

while (result->Status == Result::InProgress);
//process results

? 这样,我问第一种方法是否会在等待结果而不是不断旋转时对其他线程有礼貌?我正在等待的操作通常需要大约 1-2 秒,并且在不同的线程上。

4

4 回答 4

2

我建议在这种情况下使用信号量而不是轮询。如果您更喜欢主动等待,那么睡眠是比不断评估循环条件更好的解决方案。

于 2012-06-27T14:34:29.430 回答
1

是的,睡眠和变体放弃了处理器。其他线程可以接管。但是有更好的方法来等待其他线程。

不要使用空循环。

于 2012-06-27T14:33:26.850 回答
1

它更好,但不是很多。

只要result->Status不是volatile,编译器就可以减少

while(result->Status == Result::InProgress);

if(result->Status == Result::InProgress) for(;;) ;

因为条件在循环内不会改变。

调用外部(因此是隐式volatile)函数Sleep会改变这一点,因为这可能会修改result结构,除非编译器知道Sleep永远不会修改数据。因此,根据编译器的不同,第二种实现进入无限循环的可能性要小得多。

也不能保证访问result->Status是原子的。对于特定的内存布局和处理器架构,读取和写入此变量可能包含多个步骤,这意味着调度程序可能会决定在中间介入。

由于此时您所交流的只是一个简单的是/否,并且接收线程也应该等待否定答复,因此最好的方法是使用您的操作系统提供的适当线程同步原语来实现此效果。这样做的好处是,当条件发生变化时,您的线程会立即被唤醒,并且在此期间它不使用 CPU,因为操作系统知道您的线程正在等待什么。

在 Windows 上,使用CreateEventand co。使用事件对象进行通信;在 Unix 上,使用一个pthread_cond_t对象。

于 2012-06-27T14:49:16.687 回答
1

That depends on your OS scheduling policy too.For example Linux has CFS schedular by default and with that it will fairly distribute the processor to all the tasks. But if you make this thread as real time thread with FIFO policy then code without sleep will never relenquish the processor untill and unless a higher priority thread comes, same priority or lower will never get scheduled untill you break from the loop. if you apply SCHED_RR then processes of same priority and higher will get scheduled but not lower.

于 2012-06-27T14:51:15.537 回答