C++ 多线程同步condition_variable_any的用法

一、condition_variable_any介绍

condition_variable_any用法与condition_variable基本相同,只是它的等待函数可以采用任何可锁定类型(mutex 类型,例如std::mutex)直接作为参数,condition_vvariable对象只能采用unique_lock<mutex>。除此之外,它们的用法是相同的。

有关wait函数和notify函数的用法,请参考《C++ 多线程同步condition_variable的用法》,只有condition_variable_any的wait阻塞函数与condition_variable的wait阻塞函数不同,将第一个参数unique_lock<mutex>替换为mutex即可,其他都使用方法一样。

二、condition_variable_any示例程序

以下贴几段condition_variable_any的完整代码程序:

1、示例一

// condition_variable_any::wait (with predicate)
#include <iostream>           // std::cout
#include <thread>             // std::thread, std::this_thread::yield
#include <mutex>              // std::mutex
#include <condition_variable> // std::condition_variable_any

std::mutex mtx;
std::condition_variable_any cv;

int cargo = 0;
bool shipment_available() {return cargo!=0;}

void consume (int n) {
  for (int i=0; i<n; ++i) {
    mtx.lock();
    cv.wait(mtx,shipment_available);
    // consume:
    std::cout << cargo << '\n';
    cargo=0;
    mtx.unlock();
  }
}

int main ()
{
  std::thread consumer_thread (consume,10);

  // produce 10 items when needed:
  for (int i=0; i<10; ++i) {
    while (shipment_available()) std::this_thread::yield();
    mtx.lock();
    cargo = i+1;
    cv.notify_one();
    mtx.unlock();
  }

  consumer_thread.join();

  return 0;
}
输出:
1
2
3
4
5
6
7
8
9
10

2、示例二

// condition_variable_any::wait_for example
#include <iostream>           // std::cout
#include <thread>             // std::thread
#include <chrono>             // std::chrono::seconds
#include <mutex>              // std::mutex
#include <condition_variable> // std::condition_variable_any, std::cv_status

std::condition_variable_any cv;

int value;

void read_value() {
  std::cin >> value;
  cv.notify_one();
}

int main ()
{
  std::cout << "Please, enter an integer (I'll be printing dots): ";
  std::thread th (read_value);

  std::mutex mtx;
  mtx.lock();
  while (cv.wait_for(mtx,std::chrono::seconds(1))==std::cv_status::timeout) {
    std::cout << '.';
  }
  std::cout << "You entered: " << value << '\n';
  mtx.unlock();

  th.join();

  return 0;
}

可能的输出:

Please, enter an integer (I'll be priniting dots): .....20
You entered: 20

3、示例三

// condition_variable_any::notify_all
#include <iostream>           // std::cout
#include <thread>             // std::thread
#include <mutex>              // std::mutex
#include <condition_variable> // std::condition_variable_any

std::mutex mtx;
std::condition_variable_any cv;
bool ready = false;

void print_id (int id) {
  mtx.lock();
  while (!ready) cv.wait(mtx);
  // ...
  std::cout << "thread " << id << '\n';
  mtx.unlock();
}

void go() {
  mtx.lock();
  ready = true;
  cv.notify_all();
  mtx.unlock();
}

int main ()
{
  std::thread threads[10];
  // spawn 10 threads:
  for (int i=0; i<10; ++i)
    threads[i] = std::thread(print_id,i);

  std::cout << "10 threads ready to race...\n";
  go();                       // go!

  for (auto& th : threads) th.join();

  return 0;
}

可能的输出(线程顺序会变化):

10 threads ready to race...
thread 6
thread 2
thread 5
thread 3
thread 4
thread 1
thread 7
thread 0
thread 9
thread 8

以上三个示例程序可与condition_variable的示例程序(示例程序有解释说明)对照,本文就不再对以上示例多做解释。condition_variable学习请参考《C++ 多线程同步condition_variable的用法》

condition_variable_anyC++11标准引入的一个类,它是condition_variable的一个通用化版本。它可以与任何实现了BasicLockable概念的锁对象一起使用,比如std::mutex和std::shared_lock。condition_variable_any的构造函数可以通过调用`condition_variable_any()`来创建一个对象。它还提供了一些成员函数,比如wait()用于等待条件满足,notify_one()用于通知一个正在等待的线程,notify_all()用于通知所有正在等待的线程。在使用condition_variable_any时,需要手动加锁和解锁,并且要注意遵循特定的使用约定。通过使用condition_variable_any,我们可以更加灵活地处理条件变量的等待和通知。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [c++11 多线程支持 条件变量(condition_variable)(一)](https://blog.youkuaiyun.com/qq_40788199/article/details/126435885)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [C++ 多线程同步condition_variable_any用法](https://blog.youkuaiyun.com/weixin_43369786/article/details/129326689)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼爱幻想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值