• 【C++多线程那些事儿】多线程的执行顺序如你预期吗?


    一个简单的例子

    先来看一个多线程的例子:

    ​如图所示,我们将变量x和y初始化为0,然后在线程1中执行:

    x = 1, m = y;

    同时在线程2中执行:

    y = 1, n = x;

    当两个线程都执行结束以后,m和n的值分别是多少呢?

    对于已经工作了n年、写过无数次并发程序的的我们来说,这还不是小case吗?让我们来分析一下,大概有三种情况:

    1. 如果程序先执行了x = 1, m = y代码段,后执行了y = 1, n = x代码段,那么结果是m = 0, n = 1;

    2. 如果程序先执行了y = 1, n = x代码段,后执行了x = 1, m = y代码段,那么结果是m = 1, n = 0;

    3. 如果程序的执行顺序先是 x = 1, y = 1, 后执行m = y, n = x, 那么结果是m = 1, n = 1;

    所以(m, n)的组合一共有3种情况,分别是(0, 1), (1, 0)和(1, 1)。

    那有没有可能程序执行结束后,(m, n)的值是(0, 0)呢?嗯...我们又仔细的回顾了一下自己的分析过程:在m和n被赋值的时候,x = 1和y = 1至少有一条语句被执行了...没有问题,那应该就不会出现m和n都是0的情况。

    诡异的输出结果

    不过人在江湖上混,还是要严谨一点。好在这代码逻辑也不复杂,那就写一段简单的程序来验证下吧:

    1. #include <iostream>
    2. #include <thread>
    3. using namespace std;
    4. int x = 0, y = 0, m = 0, n = 0;
    5. int main()
    6. {
    7. while (1) {
    8. x = y = 0;
    9. thread t1([&]() { x = 1; m = y; });
    10. thread t2([&]() { y = 1; n = x; });
    11. t1.join(); t2.join();
    12. if (m == 0 && n == 0) {
    13. cout << " m == 0 && n == 0 ? impossible!\n";
    14. }
    15. }
    16. return 0;
    17. }

    考虑到多线程的随机性,就写一个无限循环多跑一会吧,反正屏幕也不会有什么输出。我们信心满满的把程序跑了起来,但很快就发现有点不太对劲:

    ​m和n

  • 相关阅读:
    node+pm2安装部署
    网络安全(黑客)自学
    yum命令详解。yum install安装卸载,yum配置仓库
    PID控制算法介绍及使用举例
    Abnova酸性磷酸酶(小麦胚芽)说明书
    微机原理——汇编指令(上部)
    【代码精读】optee的RPC机制
    Blender快捷键
    python系列教程215——列表解析与矩阵
    反射获取类属性(含父类中的属性)
  • 原文地址:https://blog.csdn.net/Linuxhus/article/details/127650694