21xrx.com
2024-11-05 20:34:02 Tuesday
登录
文章检索 我的文章 写文章
C++11条件变量:如何使用?
2023-07-05 09:00:19 深夜i     --     --
C++11 条件变量 使用

C++11引入了一个新的关键字——条件变量(conditional variables)。在多线程编程中,条件变量是一种同步机制,使得线程之间能够协调共享变量的访问。在这篇文章中,我们将看看在C++11中如何使用条件变量。

条件变量的概念

在多线程编程中,条件变量是一种用于等待和通知线程的同步机制。在共享数据中运用条件变量时,一个或多个线程等待条件变为真并且通知其他线程该条件已经为真。然后,这些线程才能继续执行。

条件变量一般包括两个基本操作——等待一个条件成立的wait()和通知其他线程条件已经成立的notify()。条件变量的基本原理是,当wait()调用被执行时,线程被阻塞,并且放弃在共享数据上的锁,直到notify()通知该条件变量的其他线程条件已经为真并且解除阻塞。

使用条件变量

使用条件变量的第一步是创建一个条件变量。在C++11中,条件变量由std::condition_variable表示,类似于其它同步机制,需要与std::mutex一起使用。

接下来,在共享数据中使用条件变量。我们将一个共享整数作为条件变量,并将其命名为data。在以下代码中,线程A将data设置为5,然后线程B等待将其设置为5。


#include <condition_variable>

#include <mutex>

#include <thread>

#include <iostream>

std::mutex mutex_;

std::condition_variable cv_;

bool ready_ = false;

int data = 0;

void set_data() {

  std::lock_guard<std::mutex> lock(mutex_);

  data = 5;

  ready_ = true;

  cv_.notify_one();

}

void wait_for_data() {

  std::unique_lock<std::mutex> lock(mutex_);

  cv_.wait(lock, [] return ready_; );

  std::cout << "The data is " << data << '\n';

}

int main() {

  std::thread t1(set_data);

  std::thread t2(wait_for_data);

  t1.join();

  t2.join();

}

在这个例子中,set_data()等待一秒钟,然后将data设置为5并将ready_设置为true。wait_for_data()等待cv_的通知,然后打印数据。注意,使用unique_lock而不是lock_guard可以确保锁可以在等待期间被释放。调用wait()阻塞当前线程,将它放置在等待队列中并释放锁。cv_的第二个参数是lambda表达式,用于判断是否需要等待。

当一个线程调用notify_one()时,被阻塞的线程中的一个将被唤醒并重新获得锁。因此,wait_for_data()会等待set_data()的运行,因为它会等待ready_为true,直到set_data()运行并设置ready_,然后才会被唤醒。

总结

简单来说,条件变量用于在共享数据中等待直到某个条件变为真。使用条件变量需要mutex支撑,我们需要等待条件变量时使用unique_lock等待,并通过lambda表达式判断是否需要等待。当某个线程完成后,可以使用notify_one()通知该条件变量的等待线程。在多线程编程中,条件变量是一种很有用的同步机制,可以防止死锁。

  
  

评论区

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