考虑以下简化示例:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mutex;
std::condition_variable cv;
bool cv_flag = false; // I'm talking about this flag here
void startThread1()
{
std::cout << "thread 1 prints first\n";
{
// Set the flag (lock to be safe)
std::unique_lock<std::mutex> lock(mutex);
cv_flag = true;
}
cv.notify_one();
}
void startThread2()
{
std::unique_lock<std::mutex> lock(mutex);
if (!cv_flag)
{
cv.wait(lock);
}
std::cout << "thread 2 prints second\n";
}
int main()
{
std::thread thread1(startThread1);
std::thread thread2(startThread2);
thread1.join();
thread2.join();
}
在这里,cv_flag
用于确保线程 2 没有锁定以及wait()
线程 1 是否已经发送了通知notify_one()
。没有它,线程 2 可能会在线程 1 已经调用wait()
之后锁定notify_one()
,从而导致无限期挂起,因为线程 2 正在等待已经发生的事情。
我见过很多这样的代码,其中类似的东西cv_flag
仅用于检测可能错过的通知。
这真的是唯一的方法吗?最干净和最简单的?我认为如果您可以执行以下操作会很棒:
std::mutex mutex;
std::condition_variable cv;
// no more need for cv_flag
void startThread1()
{
std::cout << "thread 1 prints first\n";
cv.notify_one();
}
void startThread2()
{
std::unique_lock<std::mutex> lock(mutex);
cv.wait_unless_already_notified(lock); // Unfortunately, this function doesn't exist
std::cout << "thread 2 prints second\n";
}
有什么类似的wait_unless_already_notified()
吗?如果没有,是否有技术原因导致它不存在?
编辑:将信号/信号引用更改为通知/通知/通知以消除歧义。