21xrx.com
2025-04-14 10:02:12 Monday
文章检索 我的文章 写文章
C++11 线程间通信
2023-07-04 05:01:43 深夜i     12     0
C++11 线程 通信 互斥锁 条件变量

C++11是一个新增了很多重要特性的标准,其中最重要的改进之一就是对多线程编程的支持。多线程编程可以提高程序的性能,但同时也对线程的通信和同步提出了挑战。本文将介绍C++11中线程间通信的几种方法。

1. Mutex and Lock

互斥锁(mutex)是C++11中用于防止多个线程并发访问共享资源的最基本的同步原语。通过在多个线程之间共享同一个互斥锁对象(mutex),线程可以在执行访问共享资源的操作之前,对该互斥锁进行加锁(lock)操作。

例如,将一个共享资源保护在互斥锁(mutex)中,并通过在互斥锁(mutex)保护的区域内快速加锁(lock)和解锁(unlock)操作来确保多个线程之间安全地访问该共享资源。下面是一个简单的示例:

std::mutex mtx;
void shared_print(const std::string& msg, int id) {
  std::lock_guard<std::mutex> lock(mtx);
  std::cout << msg << id << std::endl;
}
void thread_func() {
  for(int i = 0; i > -100; i--) {
    shared_print("Thread ID: ", i);
  }
}
int main() {
  std::thread t1(thread_func);
  for(int i = 0; i < 100; i++) {
    shared_print("Main Thread ID: ", i);
  }
  t1.join();
  return 0;
}

2. Condition Variables

条件变量(condition variables)是一种可以通过在多个线程之间共享同一个条件变量对象(condition variable),在某个条件满足时通知其他线程等待的同步原语。

例如,可以通过在条件变量(condition variable)保护的区域内等待某个条件成立,当该条件成立时通知其他线程,使其从等待状态中唤醒并继续执行下去。下面是一个简单的示例:

std::mutex mtx;
std::condition_variable cond_var;
bool data_ready(false);
void producer() {
  for(int i = 0; i < 5; i++) {
    std::unique_lock<std::mutex> lock(mtx); // 申请互斥锁
    data_ready = true; // 生产者产生数据
    cond_var.notify_one(); // 唤醒至少一个消费者
  }
}
void consumer() {
  while(!data_ready) {
    std::unique_lock<std::mutex> lock(mtx); // 申请互斥锁
    cond_var.wait(lock); // 释放锁并等待条件成立
  }
  std::cout << "Data is ready." << std::endl;
}
int main() {
  std::thread producer_thread(producer);
  std::thread consumer_thread(consumer);
  producer_thread.join();
  consumer_thread.join();
  return 0;
}

3. Futures

futures提供了一种异步执行代码的方法,它们允许确保一个值/对象在未来某个时间点可用。

例如,可以将一个函数在后台执行,从而允许另一线程继续执行而不需要等待函数执行完毕。下面是一个简单的示例:

std::future<int> f = std::async([](){
  std::this_thread::sleep_for(std::chrono::seconds(1));
  return 8;
});
std::cout << "Waiting..." << std::endl;
std::future_status status;
do {
  status = f.wait_for(std::chrono::milliseconds(100));
  if(status == std::future_status::deferred)
    std::cout << "deferred" << std::endl;
   else if(status == std::future_status::timeout)
    std::cout << "timeout" << std::endl;
   else if(status == std::future_status::ready)
    std::cout << "ready!" << std::endl;
  
} while(status != std::future_status::ready);
std::cout << "Result = " << f.get() << std::endl;

这篇文章介绍了C++11多种线程间通信的方法,包括互斥锁(mutex)和锁(lock)、条件变量(condition variables)和std::future 。使用这些方法,我们可以更方便地编写多线程程序,确保线程之间的同步和通信,保证程序的正确性和性能。

  
  

评论区

请求出错了