occcrdd 2019-07-11 15:42 采纳率: 60%
浏览 480
已采纳

C++多线程输入输出为什么出现异常?

    mutex m;
    char i;
    thread t([&m,&i]()
    {
        for(;true;m.unlock())
        {
            m.lock();
            cout<<"输入:";
            cin>>i;
            if(i=='t')
                cout<<"线程"<<i<<"执行中"<<endl;
        }
    }),u([&m,&i]()
    {
        for(;true;m.unlock())
        {
            m.lock();
            cout<<"输入:";
            cin>>i;
            if(i=='u')
                cout<<"线程"<<i<<"执行中"<<endl;
        }
    }),v([&m,&i]()
    {
        for(;true;m.unlock())
        {
            m.lock();
            cout<<"输入:";
            cin>>i;
            if(i=='v')
                cout<<"线程"<<i<<"执行中"<<endl;
        }
    });
    v.join();//试过了交换join顺序也没用
    u.join();
    t.join();

执行结果为什么只有一个线程正常,而且不管有多少个线程总是最后一个定义的才能正常输出
图片说明

  • 写回答

1条回答 默认 最新

  • 枫舞的季节 2019-07-11 16:42
    关注

    C++11 库看起来很好用啊。

    • 三个线程一个在接收输入,另外两个在等待解锁
    • 锁很不错,只有一个线程在工作。
    • 是因为那个工作线程一直在处于CPU上,而另外两个线程在睡觉,所以当那个工作线程让出来CPU后,另外两个没有抢上,又被工作线程抢去了。 代码修改如下,让 线程 u v t 都休眠 10ms,那两个线程就工作了。
        mutex m;
        char i;
        thread t([&m, &i]()
            {
                for (; true; )
                {
                    m.lock();
                    cout << "t running 输入:";
                    cin >> i;
                    if (i == 't')
                        cout << "线程" << i << "执行中" << endl;
                    else
                        cout << "t running loop end." << endl;
                    m.unlock();
                    Sleep(10);
                }
            }), u([&m, &i]()
                {
                    for (; true;)
                    {
                        m.lock();
                        cout << "u running 输入:";
                        cin >> i;
                        if (i == 'u')
                            cout << "线程" << i << "执行中" << endl;
                        else
                            cout << "u running loop end." << endl;
                        m.unlock();
                        Sleep(10);
                    }
                }), v([&m, &i]()
                    {
                        for (; true;)
                        {
                            m.lock();
                            cout << "v running 输入:";
                            cin >> i;
                            if (i == 'v')
                                cout << "线程" << i << "执行中" << endl;
                            else
                                cout << "v running loop end." << endl;
                            m.unlock();
                            Sleep(10);
                        }
                    });
                v.join();//试过了交换join顺序也没用
                u.join();
                t.join();
    

    打印如下:

    t running 输入:u
    t running loop end.
    u running 输入:v
    u running loop end.
    v running 输入:t
    v running loop end.
    t running 输入:t
    线程t执行中
    u running 输入:x
    u running loop end.
    v running 输入:d
    v running loop end.
    t running 输入:
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题