notify_one:唤醒等待线程中的一个,唤醒的线程顺序执行。
notify_all:唤醒所有等待的线程,唤醒的线程抢占式执行。
wait:等待。需要其它的接口来唤醒。
#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