【发布时间】:2016-01-10 22:52:25
【问题描述】:
我编写了一个小类,用于同步 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 等价物是什么。 到目前为止,我已经基于this SO question 编写了以下课程,但由于答案不完整,我不确定如何完成我的课程:
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()
{
}
};
【问题讨论】:
-
构造函数中的代码看起来应该在
Signal()中。 -
好的,谢谢。你知道“条件”的类型是什么吗?另外我怎么能无限等待?这有多快?因为如果 pthread_cond_timedwait 等待,比如说 1 秒,那么在某些情况下会有 1 秒的延迟。
-
没有等价物。一个类似的工具是 POSIX 条件变量。您需要阅读 pthread_cond_* 系列中的所有手册页,然后阅读一两个关于如何实际使用它们的教程。
-
Windows 和 POSIX 同步方法的语义不同,因此跨平台等效取决于您如何使用其中一种。从您使用
SetEvent()和WaitForSingleObject()的方式来看,信号量也可以工作。请参阅 man7.org/linux/man-pages/man3/sem_post.3.html 和 man7.org/linux/man-pages/man3/sem_wait.3.htmlsem_wait()手册页上有一些很好的示例代码。 -
@AndrewHenle 感谢您的帮助。我会看看的。我还在这里找到了关于 POSIX 线程的详细文档(法语):univ-orleans.fr/lifo/Members/Sylvain.Jubertie/enseignement/… 如果它没有给我我需要的东西,我会看看信号量的东西。
标签: c linux multithreading pthreads posix