我编写了一个小型类,用于同步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()
{
}
};
发布于 2015-10-13 09:44:39
您所描述的POSIX等价于POSIX条件变量。请注意,条件变量必须始终与POSIX互斥对象成对使用,但许多条件变量经常使用相同的互斥对象,因此如果不将互斥变量专门用于条件变量,则不应将其放在类中。在您的情况下,Win32和POSIX之间的映射应该是:
CreateEvent
-> pthread_cond_init
CloseHandle
-> pthread_cond_destroy
WaitForSingleObject
-> pthread_cond_wait
或pthread_cond_timedwait
SetEvent
-> pthread_cond_signal
或pthread_cond_broadcast
幸运的是,有很多关于这方面的文档,尽管我推荐基本的POSIX线程的编程。
发布于 2015-10-13 09:26:14
也检查一下eventfd
。如果您只需要一个消费者和一个生产者,那么它似乎几乎等同于CreateEvent
。
CreateEvent
-> eventfd
CloseHandle
-> close
SetEvent
-> write
WaitForSingleObject
-> read
WaitForMultipleObjects
-> select
和read
对应的fd
更多的阅读http://www.sourcexr.com/articles/2013/10/26/lightweight-inter-process-signaling-with-eventfd
发布于 2015-10-14 04:23:36
与您的代码等效的线程是:
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);
}
};
https://stackoverflow.com/questions/33098419
复制相似问题