c++ - std::condition_variable::wait() 误解
问题描述
为什么必须
在此代码while()
中使用with :std::condition_variable::wait()
#include <iostream> // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variable
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void print_id (int id) {
std::unique_lock<std::mutex> lck(mtx);
while (!ready) cv.wait(lck);
// ...
std::cout << "thread " << id << '\n';
}
void go() {
std::unique_lock<std::mutex> lck(mtx);
ready = true;
cv.notify_all();
}
int main ()
{
std::thread threads[10];
// spawn 10 threads:
for (int i=0; i<10; ++i)
threads[i] = std::thread(print_id,i);
std::cout << "10 threads ready to race...\n";
go(); // go!
for (auto& th : threads) th.join();
return 0;
}
据我了解,如果std::condition_variable::wait()
阻塞当前线程,并且该线程正在等待暂停,直到另一个线程正在调用 notify..() 函数
解决方案
为什么有必要将 while() 与 std::condition_variable::wait() 一起使用
wait
可以返回是否ready
为真。如果我们只想在ready
为真时继续,那么我们必须检查它,并继续等待以防万一。循环是一种方便的控制结构,用于重复操作直到满足条件。
为什么 wait() 可能看似虚假地返回
因为标准说它可能:
效果:
- 在 *this 上原子地调用
lock.unlock()
和阻塞。- 当解除阻塞时,调用
lock.lock(
(可能在锁上阻塞),然后返回。notify_one()
当通过调用或调用或虚假notify_all()
发出信号时,该函数将解除阻塞。
推荐阅读
- javascript - 如何在 Angular 中使用 HttpClient 访问传入消息对象?
- javascript - XMLHttpRequest 到另一个具有 cookie 持久性的子域?
- apache - 如何使用 htaccess 更改我的站点 URL?
- php - 开发(本地主机)和托管服务之间的 PHP 会话差异
- javascript - 在 React.js 项目中启动本地主机服务器时出现 npm start 错误
- c# - HangFire 从服务迁移
- python - function() 缺少 4 个必需的位置参数
- latex - Knit RMarkdown 报错,pdfLaTeX 编译失败
- javascript - 尝试在双数组中填充任何情况 - javascript
- reactjs - 如何在 JSX 中包含逻辑来转换对象?