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