m0_37551209
雨鹜
采纳率60%
2019-07-11 15:42

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条回答

  • justin_bkdrong 枫舞的季节 2年前

    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 输入:
    
    点赞 1 评论 复制链接分享