当前位置: 首页 > 面试题库 >

相当于Win32的CreateEvent,SetEvent,WaitForSingleObject的Linux / POSIX

阎自怡
2023-03-14
问题内容

我写了一个小类来同步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等效什么。到目前为止,我已经基于这个SO问题写了下面的课,但是由于答案不完整,所以我不确定如何完成我的课:

    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

幸运的是,尽管我建议使用基本的POSIX线程编程,但是有很多关于此的文档。



 类似资料:
  • 问题内容: 我不想知道Windows和Linux中的API函数之间是否存在一一对应的关系,也不想知道每个API函数。 我只想了解两点基本知识: 我想了解为什么Qt平台独立 我想知道我应该在Linux中使用什么API来移植使用Win32 API编程的应用程序,或者换句话说,移植到Win32 API级别。 我知道这不切实际,但我想知道这种等效性。 问题答案: 您需要了解什么是系统调用。在Linux上,

  • 问题内容: 以前,我在支持头文件的Windows上使用c ++ / c编译器,但在有Linux的Linux上使用 我想要一个功能完全一样的功能。我不知道为什么我的编译器不支持头文件 净我搜索后,得到了本该说,可能是最接近的等效但是这两个都在,如果我们写的方式不同不显示,而如果我们用输入字符的控制台上输入的文字会显示在人物安慰。我不希望角色显示在控制台上。 使用还会在控制台上显示字符。 问题答案:

  • 问题内容: 我正在编写ksh脚本,并且必须在单独的命令提示符窗口中运行可执行文件。 问题答案: 我相信你的意思是 别忘了决赛

  • 问题内容: 我正在寻找一种计算跨平台crc校验和的方法。 可以在Linux,AIX,HP-UX Itanium,Solaris上运行,在Windows中也有与Linux等效的命令吗? 注意 :没有第三方工具 问题答案: 在Windows(命令提示符)中,您可以使用CertUtil,语法如下: 在cmd中输入语法说明: 例: 默认支持的SHA1是:MD2,MD4,MD5,SHA1,SHA256,SH

  • 问题内容: 我发现Mac OS X中的“打开”命令在命令行中非常方便。从“人开”: 该命令将打开文件(或目录或URL),就像双击文件的图标一样。如果未指定应用程序名称,则使用通过LaunchServices确定的默认应用程序打开指定的文件。 也就是说,如果我想使用默认的PDF查看器(可能是“预览”)打开PDF文件,则只需执行以下操作: 但是,在Linux中,要从命令行打开PDF文件,我不得不四处寻

  • 问题内容: 我正在将应用程序从Windows迁移到Linux。我在和接口方面面临问题。 在我的应用程序中,我产生了多个线程,其中所有线程都等待父进程的事件或每t秒定期运行。 我已经检查了,但是我们必须为此指定绝对时间。 如何在Unix中实现呢? 问题答案: 坚持使用。例如: 如果需要,可以将其包装在函数中。 更新:根据我们的评论补充答案。 POSIX没有像Windows那样的单一API来等待事件/