c++ - 相当于windows事件的跨平台

标签 c++ windows multithreading boost cross-platform

我正在尝试将一些 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/

相关文章:

c++ - Windows C++ 对话框调整器类

c++ - 哪些适用于 Windows 的 C++11 编译器支持新的类型特征,例如 "is_nothrow_move_constructible"?

java - ProgressDialog不会显示 - 多线程

c++ - 返回值寄存器和析构函数调用顺序

c++ - 使用 libcurl 更新表单中的字段值

c++ - 编写接受可变跨度作为不可变跨度的模板函数

c++ - WAV 文件的 MP3 编解码器

c++ - CMake:如何禁用单个 *.cpp 文件的优化?

java - 为什么外部同步比内部同步快?

适合初学者的 Java 线程