奔向Sun吃烤串 2023-08-07 19:43 采纳率: 100%
浏览 19
已结题

c++的mutex怎么用

c++的mutex是不是要关联某个数据才能上锁?
下图中的互斥到底关联了谁?还是都关联了?

img


下图中第一行的mutex是声明还是定义,这行代码有什么作用

img

  • 写回答

6条回答 默认 最新

  • bostonAlen 2023-08-07 23:53
    关注

    不要想复杂了,你的图中仅仅是定义了几个变量,又怎么会有关联呢。
    回归语言本质,mutex只是一个对象,我们最终用的是它里面的方法lock和unlock。
    只有在lock和unlock之间的代码才是线程保护的,也就是说在lock和unlock之间我们用到了counter,这时mutex和counter才有了联系。
    没有关不关联变量的说法。至于你说的后边再加一行int counter2=1;加了对mutex和整个程序没有任何的影响,仅仅是多了一个全局变量而已。
    另外回答你的 “如果这个作用域有好几个变量和一个mutex,某个线程先拿到mutex并lock,那么其他线程就无法访问这好几个变量了”,对的,从程序角度上说。但如果考虑cpu乱序,就不准确了,这是题外话了。

    #include <iostream>  
    #include <thread>  
    #include <mutex>  
      
    std::mutex mtx;  // 创建一个互斥锁  
    int counter = 0;  // 共享数据  
      
    void increment() {  
        for (int i = 0; i < 100000; ++i) {  
            mtx.lock();  // 获取互斥锁  
            ++counter;   // 增加共享数据  
            mtx.unlock();  // 释放互斥锁  
        }  
    }  
      
    int main() {  
        std::thread t1(increment);  
        std::thread t2(increment);  
      
        t1.join();  
        t2.join();  
      
        std::cout << counter << std::endl;  // 输出结果应为200000  
        return 0;  
    }
    

    在这个例子中,std::mutex mtx;就是定义了一个全局变量mtx, int counter = 0;就是定义了一个int的全局变量,这时候这两者没有任何关系。
    真正用到mutex和counter 产生关系的是这里:

            mtx.lock();  // 获取互斥锁  
            ++counter;   // 增加共享数据  
            mtx.unlock();  // 释放互斥锁  
    

    通过lock和unlock把counter保护起来了,至于mutex在这里只是一个对象,没什么特别,我们只是用了mutex的方法而已。
    当然在lock和unlock间我们可以加更多代码,更多的变量。
    这里仅仅就是为了线程同步,使得counter 同一时间只能有一个线程访问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月8日
  • 已采纳回答 8月8日
  • 修改了问题 8月7日
  • 修改了问题 8月7日
  • 展开全部

悬赏问题

  • ¥15 C++识别堆叠物体异常
  • ¥15 音量自动减小啦!日历自动翻页
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 有人知道怎么在R语言里下载Git上的miceco这个包吗
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥20 关于DAC输出1.000V对分辨率和精度的要求
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题
  • ¥15 哪位能做百度地图导航触点播报?
  • ¥15 请问GPT语言模型怎么训练?