c++ - 为什么要打印 1,3,2?
问题描述
我试图理解 C++ 中的 std::condition_variable 。我希望函数中的 wait 语句调用 third 来阻止进程,直到 second 和 first 完成,但事实并非如此。为什么不等?它一直在打印 1,3,2。
#include <functional>
#include <mutex>
#include <condition_variable>
#include <future>
#include <iostream>
#include <string>
condition_variable c;
bool is1C=false, is2C=false, is3C=false;
mutex m1,m2,m3;
void printFirst(){
cout<<"1";
}
void printSecond(){
cout<<"2";
}
void printThird(){
cout<<"3";
}
void first(function<void()> printFirst) {
printFirst();
is1C=true;
c.notify_all();
}
void second(function<void()> printSecond) {
unique_lock<mutex> sL1(m1);
c.wait(sL1,[]{return is1C==true;});
printSecond();
is2C=true;
c.notify_all();
}
void third(function<void()> printThird) {
unique_lock<mutex> sL2(m2);
c.wait(sL2,[]{return is2C==true && is2C==true;});
printThird();
}
int main() {
function<void()> printFirstN=printFirst;
function<void()> printSecondN=printSecond;
function<void()> printThirdN=printThird;
std::async(printFirstN);
std::async(printThirdN);
std::async(printSecondN);
}
解决方案
推荐阅读
- sql - 我们如何在postgresql中获得一个月的周数
- error-handling - 通过分配输出变量和禁用弹出窗口在 VBScript 中使用 SAP 进行错误处理
- django - 如何将这 2 个视图重写为 1 个视图?
- python - Heroku 上的 Django + Celery 应用程序在本地工作,但部署时工作人员超时
- sql - 从开始和结束日期获取每个月的条目的 SQL 最佳方法
- javascript - 我可以在 javascript 的选择列表上使用 onblur 吗?
- c++ - GCC:ld.exe 找不到文件
- sql - CASE 语句中关于 WHEN 的 GROUP BY 问题
- regex - 正则表达式:在文本中查找标记的字符串
- batch-file - 在 VsCode 中的按键上执行 bat 文件