C++ 多线程的错误和如何避免(4)
对共享的资源或者数据做加锁处理
在多线程的环境下,有时需要多个线程对同一个资源或者数据进行操作,如果没有加锁,容易出现未定义的行为。
比如:
#include <iostream>
#include <string>
#include <thread>
#include <mutex>
using namespace std;
std::mutex mu;
void CallHome(string message)
{
cout << "Thread " << this_thread::get_id() << " says " << message << endl;
}
int main()
{
thread t1(CallHome, "Hello from Jupiter");
thread t2(CallHome, "Hello from Pluto");
thread t3(CallHome, "Hello from Moon");
CallHome("Hello from Main/Earth");
thread t4(CallHome, "Hello from Uranus");
thread t5(CallHome, "Hello from Neptune");
t1.join();
t2.join();
t3.join();
t4.join();
t5.join();
return 0;
}
编译后:

我们会发现 thread id 为 13984 的线程在输出到一半时被另一个线程输出的文本截断了,如果避免这种行为呢,我们需要给线程函数的 std:: cout 加一个锁。
这样就可以保证同一时间只有一个线程被允许调用 std::cout
修改:
void CallHome(string message)
{
mu.lock();
cout << "Thread " << this_thread::get_id() << " says " << message << endl;
mu.unlock();
}
输出:


浙公网安备 33010602011771号