您当前的位置: 首页 >  ar

龚建波

暂无认证

  • 3浏览

    0关注

    312博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C++ std::condition_variable条件变量

龚建波 发布时间:2019-08-31 21:54:39 ,浏览量:3

C++11提供了两个条件变量的实现:std::condition_variable和std::condition_variable_any。std::condition_variable只可与std::mutex一起使用;std::condition_variable_any更加灵活,但需要额外的性能代价。

先看看std::condition_variable的接口:

被等待的线程(唤醒别的线程)操作流程如下:

  • 获取std::mutex(如通过std::lock_guard)
  • 在持有锁时修改数据
  • 在sdt::condition_variable上执行notify_one或notify_all(不需要为通知持有锁)

等待被唤醒的线程操作流程如下:

  • 获取std::mutex(如通过std::unique_lock)
  • 执行wait、wait_for或wait_until ,该操作会自动释放互斥,并悬挂线程的执行
  • std::condition_variable被通知、超时或虚假唤醒发生,线程被唤醒,且自动重获得互斥。之后线程应检查条件,若唤醒是虚假的,则继续等待

 借用在线手册上的例子(https://zh.cppreference.com/w/cpp/thread/condition_variable):

(例子中main线程将数据以全部变量的形式给worker线程处理,处理完后再回到main线程)

#include 
#include 
#include 
#include 
#include 

std::mutex m;
std::condition_variable cv;
std::string data;
bool ready = false;
bool processed = false;

void worker_thread()
{
	// 等待直至 main() 发送数据
	std::unique_lock lk(m);
	cv.wait(lk, [] {return ready; });

	// 等待后,我们占有锁。
	std::cout             
关注
打赏
1655829268
查看更多评论
0.0504s