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();
} 

输出:

 

posted @ 2022-05-17 11:49  strive-sun  阅读(83)  评论(0编辑  收藏  举报