加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

c++多线程锁机制:条件变量condition_variable

(2024-10-05 02:53:59)
分类: 接口类的哈
#include    iostream
#include    thread
#include   mutex
#include   condition_variable

std::mutex mtx;  // 互斥锁
std::condition_variable cv;  // 条件变量
int myvalue = 0;  // 被多个线程共享的值
bool turn = false;  // 布尔变量用于指示线程执行的顺序


void increment(int thread_id) {
    for (int i = 0; i < 10; ++i) {
        std::unique_lock lock(mtx);
        cv.wait(         lock, [&] { return (thread_id == 1) ? !turn : turn; }           );

        ++myvalue;
        std::cout << "Thread " << thread_id << " incremented myvalue to " << myvalue << std::endl;

        turn = !turn;
        cv.notify_all();
    }
}
int main() {

    std::thread t1(increment, 1);
    std::thread t2(increment, 2);

    t1.join();
    t2.join();

    std::cout << "Final value of myvalue: " << myvalue << std::endl;

}

——————————————————————————
1、cv.wait(lock, [&] {    return (thread_id == 1) ? !turn : turn; }   );

cv.wait(lock,predicate),此处 predicate 单词含义:谓词。 就是 返回 布尔数值   true、false的表达式。
c++多线程锁机制:条件变量condition_variablec++多线程锁机制:条件变量condition_variable
2、 如果  return (thread_id == 1) ? !turn : turn; } 此三目运算符,
如果   
 thread_id ==1,
return 为!ture
ture 假设 当时为 falsec++多线程锁机制:条件变量condition_variable

所以  !turn=true。
三目运算符 返回结果为:return  true

简化为 cv.wait(lock,predicate=true)

那就是 thread_id   这个1号进程 不用 继续 等待,可以继续执行。即为,线程1已经等到了条件变量cv为true,可以继续执行。
————————————
如果线程为2,那  三目结果取后面的 turn :false。则 2号线程 需要等待。

https://www.bilibili.com/video/BV1E4421D76e/?spm_id_from=333.788&vd_source=2a756a841699e678985ce674ad996db8

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有