Does msleep() give cycles to other threads?

﹥>﹥吖頭↗ 提交于 2019-12-11 19:39:10

问题


In a multi threaded app, is

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

better than

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

? By that, I'm asking will the first method be polite to other threads while waiting for results rather than spinning constantly? The operation I'm waiting for usually takes about 1-2 seconds and is on a different thread.


回答1:


It's better, but not by much.

As long as result->Status is not volatile, the compiler is allowed to reduce

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

to

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

as the condition does not change inside the loop.

Calling the external (and hence implicitly volatile) function Sleep changes this, because this may modify the result structure, unless the compiler is aware that Sleep never modifies data. Thus, depending on the compiler, the second implementation is a lot less likely to go into an endless loop.

There is also no guarantee that accesses to result->Status will be atomic. For specific memory layouts and processor architectures, reading and writing this variable may consist of multiple steps, which means that the scheduler may decide to step in in the middle.

As all you are communicating at this point is a simple yes/no, and the receiving thread should also wait on a negative reply, the best way is to use the appropriate thread synchronisation primitive provided by your OS that achieves this effect. This has the advantage that your thread is woken up immediately when the condition changes, and that it uses no CPU in the meantime as the OS is aware what your thread is waiting for.

On Windows, use CreateEvent and co. to communicate using an event object; on Unix, use a pthread_cond_t object.




回答2:


I would suggest using semaphores for such case instead of polling. If you prefer active waiting, the sleep is much better solution than evaluating the loop condition constantly.




回答3:


Yes, sleep and variants give up the processor. Other threads can take over. But there are better ways to wait on other threads.

Don't use the empty loop.




回答4:


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.



来源:https://stackoverflow.com/questions/11228574/does-msleep-give-cycles-to-other-threads

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!