70 lines
1.3 KiB
C++
70 lines
1.3 KiB
C++
#pragma once
|
|
#include <mutex>
|
|
#include <condition_variable>
|
|
|
|
class AutoSemaphore
|
|
{
|
|
public:
|
|
AutoSemaphore()
|
|
{
|
|
}
|
|
|
|
virtual ~AutoSemaphore()
|
|
{
|
|
notify_all();
|
|
}
|
|
|
|
virtual void notify_all()
|
|
{
|
|
std::lock_guard<std::mutex> lck(mutx);
|
|
cv.notify_all();
|
|
}
|
|
|
|
virtual bool wait(int timeout_ms)
|
|
{
|
|
std::unique_lock<std::mutex> lck(mutx);
|
|
return cv.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::no_timeout;
|
|
}
|
|
|
|
protected:
|
|
std::mutex mutx;
|
|
std::condition_variable cv;
|
|
};
|
|
|
|
class AutoEvent : public AutoSemaphore
|
|
{
|
|
public:
|
|
AutoEvent()
|
|
: bNotify(false)
|
|
{
|
|
}
|
|
|
|
virtual ~AutoEvent()
|
|
{
|
|
notify_all();
|
|
}
|
|
|
|
virtual void notify_all()
|
|
{
|
|
std::lock_guard<std::mutex> lck(mutx);
|
|
bNotify = true;
|
|
cv.notify_all();
|
|
}
|
|
|
|
virtual bool wait(int timeout_ms)
|
|
{
|
|
std::unique_lock<std::mutex> lck(mutx);
|
|
if (bNotify)
|
|
{
|
|
bNotify = false;
|
|
return true;
|
|
}
|
|
|
|
bool ret = cv.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::no_timeout;
|
|
bNotify = false;
|
|
return ret;
|
|
}
|
|
|
|
private:
|
|
volatile bool bNotify;
|
|
}; |