我编写了一个小类,用于同步 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 的等价物是什么。
到目前为止,我已经编写了以下课程,基于这个问题 https://stackoverflow.com/questions/13030413/windows-event-implementation-in-linux-using-conditional-variables,但由于答案不完整,我不确定如何完成我的课程:
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 互斥体成对使用,但经常有多个条件变量使用相同的互斥体,因此,如果您不打算将互斥体专门用于条件变量,则不应将其放在班上。在您的情况下,Win32 和 POSIX API 之间的映射意义应该是:
CreateEvent
-> pthread_cond_init
CloseHandle
-> pthread_cond_destroy
WaitForSingleObject
-> pthread_cond_wait
or pthread_cond_timedwait
SetEvent
-> pthread_cond_signal
or pthread_cond_broadcast
幸运的是,有很多与此相关的文档,但我推荐基本的POSIX 线程编程 https://rads.stackoverflow.com/amzn/click/com/0201633922.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)