#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