我正在尝试将一些 Windows 代码移植到 Linux,最好是通过与平台无关的库(例如 boost),但是我不确定如何移植这段事件代码。
这段代码涉及两个线程(我们称它们为 A 和 B)。 A 想做一些只有 B 可以做的事情,所以它给 B 发送了一条消息,然后等待 B 说它完成了。在 Windows 中,这看起来像:
void foo();//thread a calls this
void bar(HANDLE evt);
void foo()
{
HANDLE evt = CreateEvent(0,FALSE,FALSE,0);
bCall(boost::bind(&bar, evt));
WaitForSingleObject(evt,INFINITE);
CloseHandle(evt);
}
void bar(HANDLE evt)
{
doSomething();
SetEvent(evt);
}
我查看了 boost::thread 库,但它似乎没有任何功能,我可以看到的关闭是 boost::condition_variable,但它似乎是与互斥锁结合使用的意思,即这里不是这样。
最佳答案
所有这些答案都太复杂了,来吧人们,这并不难。
namespace porting
{
class Event;
typedef Event* Event_handle;
static const unsigned k_INFINITE = 0xFFFFFFFF;
class Event
{
friend Event_handle CreateEvent( void );
friend void CloseHandle( Event_handle evt );
friend void SetEvent( Event_handle evt );
friend void WaitForSingleObject( Event_handle evt, unsigned timeout );
Event( void ) : m_bool(false) { }
bool m_bool;
boost::mutex m_mutex;
boost::condition m_condition;
};
Event_handle CreateEvent( void )
{ return new Event; }
void CloseHandle( Event_handle evt )
{ delete evt; }
void SetEvent( Event_handle evt )
{
evt->m_bool = true;
evt->m_cond.notify_all();
}
void WaitForSingleObject( Event_handle evt, unsigned timeout )
{
boost::scoped_lock lock( evt->m_mutex );
if( timeout == k_INFINITE )
{
while( !evt->m_bool )
{
evt->m_cond.wait( lock );
}
}
else
{
//slightly more complex code for timeouts
}
}
}// porting
void foo()
{
porting::Event_handle evt = porting::CreateEvent();
bCall( boost::bind(&bar, evt ) );
porting::WaitForSingleObject( evt, porting::k_INFINITE );
porting::CloseHandle(evt);
}
void bar( porting::Event_handle evt )
{
doSomething();
porting::SetEvent(evt);
}
由于我不熟悉 WaitForSingleObject
的语义(如果两个线程同时调用它会发生什么,如果同一个线程调用它两次)。但是,解决方案看起来很像这样。
关于c++ - 相当于windows事件的跨平台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1677070/