zhxue_11 2018-12-13 22: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 05:16
    关注

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

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

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

报告相同问题?

悬赏问题

  • ¥15 全志t113i启动qt应用程序提示internal error
  • ¥15 ensp可以看看嘛.
  • ¥80 51单片机C语言代码解决单片机为AT89C52是清翔单片机
  • ¥60 优博讯DT50高通安卓11系统刷完机自动进去fastboot模式
  • ¥15 minist数字识别
  • ¥15 在安装gym库的pygame时遇到问题,不知道如何解决
  • ¥20 uniapp中的webview 使用的是本地的vue页面,在模拟器上显示无法打开
  • ¥15 网上下载的3DMAX模型,不显示贴图怎么办
  • ¥15 关于#stm32#的问题:寻找一块开发版,作为智能化割草机的控制模块和树莓派主板相连,要求:最低可控制 3 个电机(两个驱动电机,1 个割草电机),其次可以与树莓派主板相连电机照片如下:
  • ¥15 潜在扩散模型的Unet特征提取
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部