首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与Win32 32的CreateEvent、SetEvent、WaitForSingleObject等效的Linux/POSIX

与Win32 32的CreateEvent、SetEvent、WaitForSingleObject等效的Linux/POSIX
EN

Stack Overflow用户
提问于 2015-10-13 09:03:03
回答 5查看 17.4K关注 0票数 5

我编写了一个小型类,用于同步Linux (实际上是Android)和Windows的线程。

下面是我的接口的Win32实现:

代码语言:javascript
运行
复制
    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等价物。到目前为止,我已经基于这个问题编写了以下类,但由于答案不完整,所以我不确定如何完成我的课程:

代码语言:javascript
运行
复制
    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()
        {

        }
    };
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-10-13 09:44:39

您所描述的POSIX等价于POSIX条件变量。请注意,条件变量必须始终与POSIX互斥对象成对使用,但许多条件变量经常使用相同的互斥对象,因此如果不将互斥变量专门用于条件变量,则不应将其放在类中。在您的情况下,Win32和POSIX之间的映射应该是:

CreateEvent -> pthread_cond_init

CloseHandle -> pthread_cond_destroy

WaitForSingleObject -> pthread_cond_waitpthread_cond_timedwait

SetEvent -> pthread_cond_signalpthread_cond_broadcast

幸运的是,有很多关于这方面的文档,尽管我推荐基本的POSIX线程的编程

票数 16
EN

Stack Overflow用户

发布于 2015-10-13 09:26:14

也检查一下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

票数 14
EN

Stack Overflow用户

发布于 2015-10-14 04:23:36

与您的代码等效的线程是:

代码语言:javascript
运行
复制
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);
    }
};
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33098419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档