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