gpt4 book ai didi

c - Linux/POSIX 等同于 Win32 的 CreateEvent、SetEvent、WaitForSingleObject

转载 作者:太空宇宙 更新时间:2023-11-04 11:59:47 27 4
gpt4 key购买 nike

我写了一个小类来同步 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),但由于答案不完整,我不确定如何完成我的类(class):

    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_waitpthread_cond_timedwait

SetEvent -> pthread_cond_signalpthread_cond_broadcast

幸运的是,有很多关于此的文档,但我推荐基本的 Programming POSIX Threads .

关于c - Linux/POSIX 等同于 Win32 的 CreateEvent、SetEvent、WaitForSingleObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52970757/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com