[c++11]條件變數測試
阿新 • • 發佈:2018-12-09
#include <iostream> #include <string> #include <thread> #include <mutex> #include <condition_variable> #include <vector> #include <chrono> std::mutex global_mutex; std::condition_variable global_cv; bool is_avaliable = false; void cv_thread() { int cnt = 0; std::unique_lock<std::mutex> lock(global_mutex); std::cout << "cv_thread, before loop, is locked = " << lock.owns_lock() << std::endl; while (is_avaliable == false) { global_cv.wait(lock); std::cout << "cv_thread, in loop, is locked = " << lock.owns_lock(); std::cout << " cnt = " << cnt << std::endl; ++cnt; if (cnt == 10) { break; } } } void cv_nodify() { std::unique_lock<std::mutex> lock(global_mutex); global_cv.notify_all(); } int main() { std::thread cv_work(cv_thread); for (int i = 0; i < 10; ++i) { std::this_thread::sleep_for(std::chrono::seconds(1)); std::cout << "send notify : " << i << std::endl; cv_nodify(); } cv_work.join(); return 0; }
輸出:
cv_thread, before loop, is locked = 1 send notify : 0 cv_thread, in loop, is locked = 1 cnt = 0 send notify : 1 cv_thread, in loop, is locked = 1 cnt = 1 send notify : 2 cv_thread, in loop, is locked = 1 cnt = 2 send notify : 3 cv_thread, in loop, is locked = 1 cnt = 3 send notify : 4 cv_thread, in loop, is locked = 1 cnt = 4 send notify : 5 cv_thread, in loop, is locked = 1 cnt = 5 send notify : 6 cv_thread, in loop, is locked = 1 cnt = 6 send notify : 7 cv_thread, in loop, is locked = 1 cnt = 7 send notify : 8 cv_thread, in loop, is locked = 1 cnt = 8 send notify : 9 cv_thread, in loop, is locked = 1 cnt = 9