- 条件变量也是线程同步的方法
- std::condition_variable提供了两类操作:wait和notify。
#include "day4.hpp"
#include <iostream>
#include <mutex>
#include <condition_variable>
#include <thread>
#include <chrono>
namespace day4 {
std::mutex mutex;
std::condition_variable cv;
bool need_gone = false;
void TestWait() {
std::unique_lock ul(mutex);
std::cout << "TestWait start" << std::endl;
cv.wait(ul);
std::cout << "TestWait over" << std::endl;
}
void TestNotify() {
std::this_thread::sleep_for(std::chrono::seconds(5));
std::unique_lock ul(mutex);
for (int i = 0; i < 100; ++i) {
if (i % 10 == 0) {
std::cout << "TestNotify ...." << std::endl;
}
}
std::cout << "TestNotify over" << std::endl;
need_gone = true;
cv.notify_all();
}
void TestWait1() {
std::unique_lock ul(mutex);
std::cout << "TestWait1 start" << std::endl;
while(need_gone == false) {
cv.wait(ul);
}
std::cout << "TestWait1 over" << std::endl;
}
void TestWait2() {
std::unique_lock ul(mutex);
std::cout << "TestWait2 start" << std::endl;
cv.wait(ul, []() {
return need_gone;
});
std::cout << "TestWait2 over" << std::endl;
}
void TestWait3() {
std::unique_lock ul(mutex);
std::cout << "TestWait3 start" << std::endl;
cv.wait_for(ul, std::chrono::milliseconds(1));
std::cout << "TestWait3 over" << std::endl;
}
void TestDay4() {
std::thread t1(TestWait);
std::thread t3(TestWait1);
std::thread t4(TestWait2);
std::thread t5(TestWait3);
std::thread t2(TestNotify);
t2.join();
t1.join();
t3.join();
t4.join();
t5.join();
}
}