怎么理解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可以给三个线程上锁吗?

c++

1个回答

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

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

zhxue_11
zhxue_11 你好,我这里是写错,本来答案是.detch()我给写成了.join()试试看。谢谢了
接近 2 年之前 回复
caozhy
回答这么多问题就耍赖把我的积分一笔勾销了 厉害了,说的太对了。lz如果问题解决,请点个采纳吧。谢谢
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问