c++ cout 多线程

2020-03-31  本文已影响0人  胖子罗

c++多线程复习想看看线程执行顺序。

#include <thread>
#include <iostream>
#include <mutex>
using namespace std;
mutex mu;
void test(char c)
{
    cout << c << endl;
}
int main()
{
    thread t1(test, 'A');
    thread t2(test, 'B');
    t1.join();
    t2.join();
    return 0;
}

运行结果:


image.png

发现结果连到一块了,还多出一个空行。显然test函数中cout不是多线程安全的,导致输出乱序,需要自己处理同步。

方法一:使用printf替代cout

void test(char c)
{
    //cout << c << endl;
    printf("%c\n", c);
}

方法二:加锁

void test(char c)
{
    mu.lock();
    cout << c << endl;
    mu.unlock();
}

上面加锁方式不安全,如果输出那行出现异常则导致无法解锁,所以可以用更优方式:

void test(char c)
{
    //printf("%c\n",c);
    //mu.lock();
    unique_lock<mutex> lock(mu);
    cout << c << endl;
    //mu.unlock();
}

达到预期:


image.png
上一篇 下一篇

猜你喜欢

热点阅读