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的用法》

猜你喜欢

转载自blog.csdn.net/weixin_43369786/article/details/129326689