#include <iostream> // std::cout
#include <thread> // std::thread
#include <chrono> // std::chrono::seconds
#include <mutex> // std::mutex, std::unique_lock
#include <condition_variable>
#include <atomic>
std::mutex mtx;
std::condition_variable m_ConditionVariable;
std::atomic<bool> g_Ready = ATOMIC_FLAG_INIT;
void triggerNotify()
{
std::this_thread::sleep_for(std::chrono::seconds(3));
{
std::unique_lock<std::mutex> notify(mtx);
g_Ready = true;
m_ConditionVariable.notify_one();
}
std::cout << "send message." << std::endl;
}
int main()
{
std::thread th(triggerNotify);
th.detach();
std::this_thread::sleep_for(std::chrono::seconds(20));
std::cout << "begin wait" << std::endl;
std::unique_lock<std::mutex> lck(mtx);
while (m_ConditionVariable.wait_for(lck,
std::chrono::milliseconds(20000),
[&]() { return g_Ready.load(); })) {
std::cout << "g_Ready: " << g_Ready << std::endl;
g_Ready = false;
std::cout << "recv inotify" << std::endl;
}
std::cout << "wait over." << std::endl;
system("pause");
return 0;
}
经过测试如果先调用notify_one,再调用wait也会唤醒成功