21xrx.com
2024-12-22 17:05:12 Sunday
登录
文章检索 我的文章 写文章
C++11 线程间通信
2023-07-04 05:01:43 深夜i     --     --
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 。使用这些方法,我们可以更方便地编写多线程程序,确保线程之间的同步和通信,保证程序的正确性和性能。

  
  

评论区

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