Linux / POSIX等效于Win32的CreateEvent,SetEvent,WaitForSingleObject

我写了一个小类来同步Linux(实际上是Android)和Windows的线程。

这是我的界面的Win32实现:

class SyncObjectWin32 : public SyncObject { private: const HANDLE m_hEvent; public: SyncObjectWin32() : m_hEvent( ::CreateEvent( NULL, FALSE, FALSE ) ) { if( NULL == m_hEvent ) throw core::Exception( "sys::SyncObjectWin32::SyncObjectWin32() - Failed to create event." ); } ~SyncObjectWin32() { ::CloseHandle( m_hEvent ); } void WaitForSignal() { ::WaitForSingleObject( m_hEvent ); } void Signal() { ::SetEvent( m_hEvent ); } }; 

问题是我不确定什么是POSIX等价物。 到目前为止,基于这个问题 ,我已经编写了以下课程,但由于答案不完整,我不确定如何完成课程:

  class SyncObjectPosix { private: pthread_mutex_t m_oMutex; public: SyncObjectPosix() { pthread_mutex_lock( m_oMutex ); // lock mutex bool & signalled = find_signal( condition ); // find predicate signalled = true; // set predicate pthread_mutex_unlock( m_oMutex ); // unlock mutex pthread_cond_signal( condition ); // signal condition variable } ~SyncObjectPosix() { } void WaitForSignal() { pthread_mutex_lock(mutex); // lock mutex bool & signalled = find_signal( condition ); // find predicate while (!signalled) { pthread_cond_timedwait(condition, m_oMutex, timeout); } signalled = false; // reset predicate pthread_mutex_unlock( m_oMutex ); // unlock mutex } void Signal() { } }; 

所描述的POSIX等价物是POSIX条件变量。 请注意,条件变量必须始终与POSIX互斥锁配对使用,但很多情况下,多个条件变量使用相同的互斥锁,因此如果您不打算将互斥锁专用于条件变量,则不应将其置于class级。 在Win32和POSIX API之间的意义映射应该是:

CreateEvent – > pthread_cond_init

CloseHandle – > pthread_cond_destroy

WaitForSingleObject – > pthread_cond_waitpthread_cond_timedwait

SetEvent – > pthread_cond_signalpthread_cond_broadcast

幸运的是,有很多关于此的文档,但我推荐基本的编程POSIX线程 。

检查eventfd 。 如果您只需要一个消费者和一个生产者,它似乎几乎等同于CreateEvent

CreateEvent – > eventfd

CloseHandle – > close

SetEvent – > write

WaitForSingleObject – > read

WaitForMultipleObjects – > selectread相应的fd

更多阅读http://www.sourcexr.com/articles/2013/10/26/lightweight-inter-process-signaling-with-eventfd

与你的代码相当的pthreads是:

 class SyncObjectPosix { private: bool signalled; pthread_mutex_t mutex; pthread_cond_t cond; public: SyncObjectPosix() { signalled = false; pthread_mutex_init(&mutex, NULL); pthread_cond_init(&cond, NULL); } ~SyncObjectPosix() { pthread_mutex_destroy(&mutex); pthread_cond_destroy(&cond); } void WaitForSignal() { pthread_mutex_lock(&mutex); while (!signalled) { pthread_cond_wait(&cond, &mutex); } signalled = false; pthread_mutex_unlock(&mutex); } void Signal() { pthread_mutex_lock(&mutex); signalled = true; pthread_mutex_unlock(&mutex); pthread_cond_signal(&cond); } }; 

我们的开源pevents库是针对所有平台的实现。 它是一个非常小的(单文件)C ++代码,您可以将其添加到现有项目中,并访问构建在pthreads同步原语之上的Windows事件API。

最重要的一点是它包含WaitForMultipleObjects支持。

https://github.com/neosmart/pevents