在Windows c + +我可以创build一个事件的句柄
处理h = CreateEvent(…)
然后我可以设置和重置该事件
SetEvent(…)和ResetEvent(…)
最后,我可以使用命令OpenEvent(…)
是否有提升等同于事件?
我认为你需要使用boost::mutex
, boost::unique_lock
, boost::condition_variable
和可能的bool
来模仿事件。
实际上你可能需要一些WaitForSingleObject
来等待一个事件。 可能是这样的:
void wait_for_user_input() { boost::unique_lock<boost::mutex> lock(mut); while(!data_ready) { cond.wait(lock); } process_user_input(); // it might be not necessary to hold mutex locked here!!! // if so just add curly braces like this: // void wait_for_user_input() // { // { // boost::unique_lock<boost::mutex> lock(mut); // while(!data_ready) { cond.wait(lock); } // } // process_user_input(); // } }
线程安全的Boost Signals2库可能对您有用。 原来的信号库不是线程安全的,但是实现了一个信号/插槽框架,这个框架距离事件的想法不远。 由于Signals2是线程安全的,因此您应该可以利用它来在线程之间传递事件。
一个提升锁 (mutex)会做几乎相同的事情。 你可以等这些。
你想要的是来自boost进程库的 named_condition变量 。 与Windows事件的主要区别是,您必须将它们与named_mutex结合使用。
请注意,可以在单个进程中使用这些boost进程间基元。 我假设你需要这些,因为你正在使用OpenEvent(这意味着通过使用名称共享对象)。 如果可以避免使用名称,那么可以使用boost线程库中的非命名变体。