【发布时间】:2016-08-17 23:15:15
【问题描述】:
我正在尝试同步一组线程。这些线程大部分时间都在休眠,醒来完成他们预定的工作。我正在为他们使用std::thread。
不幸的是,当我终止应用程序线程时,会阻止它退出。在 C# 中,我可以将线程设为background,以便在应用退出时终止。在我看来,等价林特性在 C++ 中不可用。
所以我决定使用一种事件指示器,让线程在应用退出时唤醒。标准 C++11 std::condition_variable 需要一个唯一的锁,所以我不能使用它,因为我需要两个线程同时唤醒(它们不共享任何资源)。
最终,我决定使用 WinApi 的CreateEvent + SetEvent+WaitForSingleObject 来解决问题。
我有办法只使用 c++11 来实现相同的行为吗?
再次,我想要什么:
- 一组线程独立工作,通常处于休眠状态 特定时期(不同线程可能不同;
-
所有 threds 都会检查一个变量是否可供所有人使用 现在是停止工作的时候了(我称这个变量为
IsAliva)。 实际上所有线程都像这样循环旋转:while (IsAlive) { // Do work std::this_thread::sleep_for(...); } - 线程必须能够同时工作,不能互相阻塞;
- 当应用程序关闭并引发事件时,它使线程 立即醒来,无论超时;
- 醒来,它会检查
IsAlive并退出。
【问题讨论】:
-
我不明白第 4 点和第 5 点。
-
该事件使线程在超时结束前唤醒。
-
“他们不共享任何资源”和“所有线程检查一个变量[..]
IsAlive”不兼容。跨度> -
此变量受互斥体保护。
-
你使用唯一的锁来保护这个变量只有条件变量。
标签: c++ multithreading c++11 mutex