【发布时间】:2015-06-28 18:09:33
【问题描述】:
我使用 C++ 和 POSIX 线程创建了一个多线程应用程序。我现在应该在其中阻塞一个线程(主线程),直到设置一个布尔标志(变为真)。
我找到了两种方法来完成这项工作。
-
在循环中旋转没有睡眠。
while(!flag); -
通过一个循环睡眠。
while(!flag){ sleep(some_int); }
如果我应该遵循第一种方式,为什么有些人会按照第二种方式编写代码?如果要使用第二种方式,为什么要让当前线程休眠?这种方式有什么缺点?
【问题讨论】:
-
您错过了一个重要的选择:如果这些都不是正确的做法怎么办? (提示,在几乎所有情况下,这些都不是正确的做法。)
-
使用信号量代替:声明一个全局
sem_t*并在之前使用sem_open创建线程对其进行初始化。将设置flag = true的部分替换为sem_post,将等待while (!flag)的部分替换为sem_get。 -
@barakmanos 感谢您的评论,这很清楚,但是我很想知道这两个中哪一个更适合使用。
-
我会选择第二个选项,但这实际上取决于您的线程时间以及
some_int的值。在某些(相对罕见的)场景中,第一个选项实际上可能会在运行时间方面产生更好的结果。
标签: c++ c multithreading