我使用C ++和POSIX线程创建了一个多线程应用程序。我现在应该阻塞一个线程(主线程),直到设置一个布尔标志(变为真)。
我找到了两种方法来完成这项工作。
在没有睡眠的情况下通过循环进行旋转。
DELETE
使用睡眠旋转循环。
while(!flag);
如果我应该遵循第一种方式,为什么有些人会按照第二种方式编写代码?如果应该使用第二种方式,为什么我们要让当前线程进入睡眠状态?这种方式的缺点是什么?
答案 0 :(得分:8)
第一个选项("忙等待")在等待期间浪费整个核心,阻止其他有用的工作和/或浪费能量。
第二个选项不那么浪费 - 等待的线程使用非常少的CPU并允许其他线程运行。但是继续切换回线程来检查标志仍然是浪费。
使用条件变量要好得多,它允许等待线程在不继续使用任何资源的情况下进行阻塞,直到能够继续。
答案 1 :(得分:4)
while(flag);
将导致您的线程使用其分配的所有时间来检查条件。这浪费了很多CPU周期来检查可能没有改变的东西。
稍微休眠导致线程暂停,并将CPU放弃到实际需要它的程序。
你不应该这样做;你应该使用一个线程库来创建一个标志对象并调用它的wait
函数,这样内核就会暂停线程,直到设置了标志。
答案 2 :(得分:2)
第一种方式(只是普通的while
)浪费资源,特别是流程的处理器时间。
当一个线程放入sleep
时,操作系统可能会在讨论具有抢先式多任务处理的系统时决定处理器将用于不同的任务。理论上,如果您拥有与线程一样多的处理器/核心,则不会有任何差别。
如果解决方案的好坏取决于所使用的操作系统,有时是程序运行的架构。您应该参考您的系统调用参考,以了解更多相关信息。