C++ wait/notify机制
C++ wait/notify机制
notify_one:唤醒等待线程中的一个,唤醒的线程顺序执行。
notify_all:唤醒所有等待的线程,唤醒的线程抢占式执行。
wait:等待。需要其它的接口来唤醒。
instance analysis
#include <iostream>
#include <thread>
#include <condition_variable>
#include <mutex>//demo
#include <unistd.h>
std::mutex mtx_syn;
std::condition_variable cv_syn;
std::condition_variable cv_syn_1;
bool ready = false;//线程A
void threadA(int id)
{
while (1)
{
std::unique_lock<std::mutex> lck(mtx_syn);
while (!ready)
{
cv_syn.wait(lck);
}
// ...
std::cout << "threadA " << id << '\n';
usleep(500*1000);
cv_syn.notify_one(); // 唤醒等待线程中的一个
cv_syn.wait(lck); // 等待
}
}// 线程B
void threadB(int id)
{
while (1)
{
//新创建的 unique_lock 对象管理 Mutex 对象 m,并尝试调用 m.lock() 对 Mutex 对象进行上锁,如果此时另外某个 unique_lock 对象已经管理了该 Mutex 对象 m,则当前线程将会被阻塞
std::unique_lock<std::mutex> lck(mtx_syn);
while (!ready)
{
cv_syn.wait(lck);
}
// ...
std::cout << "threadB " << id << '\n';
usleep(500*1000);
cv_syn.notify_one();// 唤醒等待线程中的一个
cv_syn.wait(lck);
}
}
// 线程C
void threadC(int id)
{
while (1)
{
std::unique_lock<std::mutex> lck(mtx_syn);
while (!ready) cv_syn.wait(lck);
// ...
std::cout << "threadC " << id << '\n';
usleep(500*1000);
cv_syn.notify_one(); // 唤醒等待线程中的一个线程
cv_syn.wait(lck);
}
}
void go()
{
std::unique_lock<std::mutex> lck(mtx_syn);
ready = true;
//cv_syn.notify_one(); // 唤醒等待线程中的一个线程,notify_one()唤醒的线程顺序执行
cv_syn.notify_all(); //唤醒的线程抢占式知性
}
int main()
{
//线程同步
std::thread threads[5];
threads[0] = std::thread(threadA, 0);
threads[1] = std::thread(threadB, 1);
threads[2] = std::thread(threadC, 2);
std::cout << "3 threads ready to race...\n";
go(); // go!
for (auto& th : threads) th.join();
}
g++ main.cpp -o main -std=c++11 -lpthread