21xrx.com
2024-11-10 00:38:05 Sunday
登录
文章检索 我的文章 写文章
C++线程同步的方法详解
2023-07-06 11:19:42 深夜i     --     --
C++ 线程 同步 方法 详解

C++是一种高效、通用的编程语言,支持多线程编程,但同时也需要考虑多线程同步的问题。线程同步是指多个线程之间按照特定的顺序协调运行,以达到正确地处理共享资源的目的。本文将详细介绍C++中实现线程同步的方法。

1. 互斥锁

互斥锁是一种效率较高的线程同步机制,它可以保证在同一时刻只有一个线程可以访问共享资源。C++中提供了mutex类用于实现互斥锁,使用该类的示例代码如下:


#include <iostream>

#include <thread>

#include <mutex>

using namespace std;

mutex mtx;

void print_thread(int n)

{

  mtx.lock(); // 线程同步开始

  cout << "Thread " << n << " is running." << endl;

  mtx.unlock(); // 线程同步结束

}

int main()

{

  thread t1(print_thread, 1);

  thread t2(print_thread, 2);

  t1.join();

  t2.join();

  return 0;

}

在该代码中,我们使用mutex类的lock()和unlock()方法实现了线程同步。在其中一个线程获得了互斥锁时,另一个线程会处于等待状态。当第一个线程释放互斥锁时,第二个线程才能继续执行。

2. 条件变量

条件变量可以用来在不同的线程之间进行通信,使得等待资源的线程能够在资源可用时及时唤醒。C++中提供了condition_variable类,用于实现条件变量。使用该类的示例代码如下:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

using namespace std;

mutex mtx;

condition_variable cv;

bool ready = false;

void print_thread(int n)

{

  unique_lock<mutex> lock(mtx);

  while(!ready) cv.wait(lock); // 等待条件变量,进入阻塞状态

  cout << "Thread " << n << " is running." << endl;

}

int main()

{

  thread t1(print_thread, 1);

  thread t2(print_thread, 2);

  // 模拟资源可用

  this_thread::sleep_for(chrono::seconds(2));

  ready = true;

  cv.notify_all(); // 唤醒等待的线程

  t1.join();

  t2.join();

  return 0;

}

在该代码中,我们使用condition_variable类的wait()和notify_all()方法实现了条件变量。当资源不可用时,线程将等待条件变量cv进入阻塞状态。当资源可用时,线程将被唤醒并继续执行。

3. 信号量

信号量是一种更为复杂的线程同步机制,它可以控制多个线程之间的同步,并支持限制同时访问资源的线程数目。C++中提供了semaphore类,用于实现信号量。使用该类的示例代码如下:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

#include <semaphore.h>

using namespace std;

sem_t sem;

void thread1(int n)

{

  sem_wait(&sem); // 等待资源可用

  cout << "Thread " << n << " is running." << endl;

  sem_post(&sem); // 释放资源

}

void thread2(int n)

{

  sem_wait(&sem); // 等待资源可用

  cout << "Thread " << n << " is running." << endl;

  sem_post(&sem); // 释放资源

}

int main()

{

  sem_init(&sem, 0, 1); // 初始化信号量

  thread t1(thread1, 1);

  thread t2(thread2, 2);

  t1.join();

  t2.join();

  sem_destroy(&sem); // 销毁信号量

  return 0;

}

在该代码中,我们使用semaphore类的wait()和post()方法实现了信号量。初始时,信号量的值为1,表示资源可用。当一个线程进入临界区时,它使用sem_wait()方法等待资源可用;当它离开临界区时,它使用sem_post()方法释放资源。在本例中,两个线程只能其中之一进入临界区,保证了线程同步的正确性。

总结

本文介绍了C++中实现线程同步的三种方法:互斥锁、条件变量和信号量。互斥锁可以使得同一时刻只有一个线程可以访问共享资源;条件变量可以在不同的线程之间进行通信,并使等待资源的线程在资源可用时及时唤醒;信号量可以控制多个线程之间的同步,并支持限制同时访问资源的线程数目。不同的应用场景需要选择合适的线程同步机制。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复