与阻止呼叫同步
Synchronization with blocking call
假设我有一个具有以下接口的类:
class IEvent
{
void SetEvent() = 0;
void WaitForEvent() = 0;
}
WaitForEvent()
是一个阻止功能,等待直到另一个线程调用SetEvent()
函数。
我正在为此课程编写单元测试,并且需要以下方案:
第一个线程调用WaitForEvent()
。之后第二个线程致电SetEvent()
。
如何同步SetEvent()
调用将始终遵循WaitForEvent()
调用的线程?
我不想使用任何睡眠,因为我希望单位测试尽可能快地进行。
这是我可以管理的最好的
#include <mutex>
#include <condition_variable>
#include <thread>
#include <iostream>
class IEvent
{
public:
virtual void SetEvent() = 0;
virtual void WaitForEvent() = 0;
};
class EventClass : public IEvent
{
public:
void SetEvent() override {
std::unique_lock<std::mutex> lock { _mutex };
std::cout << "setting eventn";
_event = true;
lock.unlock();
_cv.notify_all();
}
void WaitForEvent() override {
std::unique_lock<std::mutex> lock { _mutex };
std::cout << "waiting for eventn";
_cv.wait(lock, [this]{ return _event; });
std::cout << "waiting completen";
};
private:
std::mutex _mutex;
std::condition_variable _cv;
bool _event = false;
};
int main()
{
EventClass object;
std::mutex cv_mutex;
std::condition_variable may_set_cv;
bool may_set_event = false;
auto setting_thread = std::thread([&]{
std::unique_lock<std::mutex> lock { cv_mutex };
may_set_cv.wait(lock,
[&] {
return may_set_event;
});
object.SetEvent();
});
std::unique_lock<std::mutex> lock { cv_mutex };
may_set_event = true;
lock.unlock();
may_set_cv.notify_one();
// tiny race condition here
object.WaitForEvent();
setting_thread.join();
}
相关文章:
- 呼叫运营商<<临时
- 松弛原子与无同步情况下的记忆连贯性
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中同步线程
- 与 stdio 同步是否使程序 I/O 非交互式?
- 如何在qt中同步应用程序和显示器的刷新率?
- Windows 进程间同步类似事件?
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 将 10 个线程与原子布尔值同步
- ofstream::close() 是否在 Linux 上调用同步?
- 与Visual Studios(c ++)同步时如何组织github存储库?
- 原子获取是否与互斥锁释放同步?
- Boost (Beast) websocket:同步写入挂起
- Postgres vs MySQL:命令不同步;.
- 线程过程中的线程同步问题
- 同步读取多个 TCP 响应
- 同步两个具有不同帧速率的传感器
- 如何定期同步线程?
- QSerialPort 手动 RTS 开/关未同步呼叫
- 与阻止呼叫同步