zhxue_11 2018-12-14 06:51 采纳率: 0%
浏览 2634
已采纳

怎么理解C++中的mutex锁?

编写程序完成如下功能:

1)有一int型全局变量g_Flag初始值为0

2) 在主线称中起动线程1,打印“this is thread1”,并将g_Flag设置为1

3) 在主线称中启动线程2,打印“this is thread2”,并将g_Flag设置为2

4) 线程序1需要在线程2退出后才能退出

5) 主线程在检测到g_Flag从1变为2,或者从2变为1的时候退出

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;

std::condition_variable cv;
std::mutex metx;
int g_Flag = 0;
int cnt = 0;
bool flag = false;

int main(void) {
    thread t1([&]{
        std::unique_lock<std::mutex> lk(metx);
        cout << "this is thread1\n";
        g_Flag = 1;
        ++cnt;
        cv.wait(lk, [&]{{
            return flag;
        }});
        cout << "thread1 exit\n";
    });

    thread t2([&]{
        std::unique_lock<std::mutex> lk(metx);
        cout << "this is thread2\n";
        g_Flag = 2;
        cnt++;
        flag = true;
        cv.notify_all();
        cout << "thread2 exit\n";
    });

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

    std::unique_lock<std::mutex> lc(metx);
    cv.wait(lc, [&]{
        return cnt >= 2;
    });
    cout << "main thread exit\n";

    return 0;
}

首先进入thread1,std::unique_lockstd::mutex lk(metx);给thread1上锁,输出"this is thread1\n",改g_Flag,++cnt。进入cv.wait(),条件为false,阻塞线程。同一个lk可以为一个线程上锁两次?还是等待条件为ture时调用metx.unlock()?

同时,一个全局变量metx可以给三个线程上锁吗?

  • 写回答

1条回答 默认 最新

  • 蒋晟 2018-12-14 13:16
    关注

    condition_variable 等待需要一个mutex没错,但是你不能把保护线程完整执行的那个拿来用,因为已经加过锁了。

    你现在两个线程是顺序执行而不是同步执行,两个线程没有访问冲突的可能性,主线程是在两个线程终止之后才开始执行变量访问的代码,变量用不着保护。
    ——但是这个跟你的需求就有冲突了,你的需求是主线程需要在一个线程结束,另外一个线程尚未开始的时候去检测g_Flag的值。你应该重新设计你的程序。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献