![](https://img-blog.csdnimg.cn/20210118221347395.gif)
来源:微信公众号「编程学习基地」
condition_variable条件变量
简单使用
#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <mutex>
#include <condition_variable>
using namespace std;
class WaitMessage
{
public:
WaitMessage(int messageType = 0, int llSize = 1024)
: kSessionAvailable(0)
, kSessionResults(nullptr)
{
}
~WaitMessage()
{
}
public:
inline void InitResult(void* lpRequest = NULL, int available = 0)
{
std::unique_lock <std::mutex> _lock(kSessionLock);
kSessionResults = nullptr;
kSessionAvailable = available;
}
inline void PostResult(void* lpResults, int available = 1)
{
std::unique_lock <std::mutex> _lock(kSessionLock);
kSessionResults = lpResults;
kSessionAvailable = available;
cout << "post info" << endl;
kSessionSignal.notify_one();
}
inline void* WaitResult()
{
std::unique_lock <std::mutex> _lock(kSessionLock);
while (kSessionAvailable == 0) {
cout << "start write" << endl;
kSessionSignal.wait(_lock);
cout << "run continue" << endl;
}
return kSessionResults;
}
inline void* WaitResult(int ms)
{
std::unique_lock <std::mutex> _lock(kSessionLock);
while (kSessionAvailable == 0) {
cout << ms << endl;
std::cv_status staue = kSessionSignal.wait_for(_lock, std::chrono::milliseconds(ms));
if (staue == std::cv_status::timeout) {
cout << "timeout" << endl;
break;
}
else if(staue == std::cv_status::no_timeout)
{
cout << "no_timeout" << endl;
}
}
cout << "continue run" << endl;
return kSessionResults;
}
std::mutex kSessionLock;
std::condition_variable kSessionSignal;
void* kSessionResults;
int kSessionAvailable;
};
WaitMessage m_WaitMessage;
void do_wait()
{
cout << "run do_wite thread" << endl;
#if 0
m_WaitMessage.WaitResult();
#else
void* result = m_WaitMessage.WaitResult(3 * 1000);
if (result == NULL) {
cout << "error result is null、" << endl;
return;
}
string str = (char*)result;
cout << "recv return:" << str << endl;
#endif
}
void do_post()
{
string str = "do_post string";
cout << "run do_post thread" << endl;
while (true)
{
_sleep(2000);
m_WaitMessage.PostResult((void*)str.c_str());
}
}
int main()
{
m_WaitMessage.InitResult(NULL);
std::thread wait_thread(do_wait);
std::thread post_thread(do_post);
post_thread.join();
wait_thread.join();
}