![]() |
1
5
一个可供使用的示例
|
![]() |
2
15
不,不在C++的标准C++中(当然有非标准的、平台特定的方法来做,而且很可能会将某种信号量添加到C++ 2A中)。
对。
不,首先,你不能等待
条件变量受到“虚假唤醒”的影响,这意味着它们可以毫无理由地停止等待。为了判断它是因为被通知而唤醒,还是被错误地唤醒,您需要一个状态变量,由通知线程设置并由等待线程读取。因为该变量由多个线程共享,所以需要安全地访问它,而互斥体确保了这一点。 即使对共享变量使用原子变量,通常仍需要互斥来避免错过通知。 |
![]() |
3
8
你用
是的,有必要使用
|
![]() |
4
5
有一个可悲但真实的事实——您正在寻找的是一个信号,而POSIX线程没有真正的信号机制。 另外,与任何类型的时序相关联的唯一POSIX线程基元是条件变量,这就是为什么您的在线搜索引导您去它的原因,并且因为C++线程模型在POSIX API上大量构建,所以在标准C++中POSIX兼容的原语就是您所能得到的。
除非您愿意离开POSIX(您不表示平台,但有一些本地平台方法可以处理不受这些限制的事件,尤其是
您的问题并没有特别要求代码示例,所以我没有提供任何示例。如果您要,请告诉我。 |
![]() |
5
1
简单创建一个
等待线程可以
中断做某事
|
![]() |
6
0
一个替代方案 条件变量 您可以更定期地唤醒线程,检查“正在运行”标志,如果未设置该标志,并且分配的时间尚未到期,则返回睡眠状态:
注:
你可以根据自己的需要设定实际的等待时间。在这个例子中,我做了100毫秒
例如,在一个应用程序中,我做了整整一秒钟,因为我很高兴我的应用程序在所有线程停止前等待一整秒钟,然后在退出时关闭。
您需要它的响应能力取决于您的应用程序。起床时间越短越好
|
![]() |
7
0
您还可以使用Promise/Future,这样您就不必费心于条件和/或线程了:
|
![]() |
8
0
你可以使用
std::promise
/
std::future
作为比
基本实例:
|
![]() |
da cheng · 在c++11中使用条件变量使程序陷入死锁 7 年前 |
![]() |
Eunjeong Choi · 为什么此代码返回意外结果?(条件变量) 7 年前 |
![]() |
Razonixx · 从线程内增加全局计数器变量,而不必等待每个线程 7 年前 |
![]() |
Administrator · c#-等待完成2个线程中的1个 7 年前 |
![]() |
Francis Cugler · 删除Windows库依赖项 7 年前 |
![]() |
AshR · 程序断断续续地使用main报告与线程本身不同的线程id 7 年前 |
|
user7256215 · 在macOS内核扩展中有效地使用同步 7 年前 |