1

我有一个 WIN32 应用程序,我正在将它移植到 LINUX GNU。我在 WIN32 应用程序中有事件基础 C 代码。现在我尝试了几种在 GNU linux 中实现相同功能的方法,但不知何故我觉得这段代码无法正常工作。

首先,我创建了一个结构来实现事件。

typedef struct _Event
   {
      int m_bool;
      pthread_mutex_t m_mutex;
      pthread_cond_t m_condition;

   }MyEvent, * Event_handle;

为了实现“SetEvent”、“ResetEvent”、“WaitForSingleObject”,我实现了以下代码。

   MyEvent CreateEvent( void )
   {
       MyEvent e1;
       e1.m_bool = 1;
       return e1;
   }

   void SetEvent( MyEvent evt )
   {
      evt.m_bool = 1;
      pthread_cond_broadcast(&evt.m_condition);
   }

   void ResetEvent( MyEvent evt )
   {
      evt.m_bool = 0;
      pthread_cond_broadcast(&evt.m_condition);
   }

   int WaitForSingleObject( MyEvent evt, unsigned timeout )
   {
         pthread_cond_wait(&(evt.m_condition),&(evt.m_mutex));
         return SUCCESS;
   }

现在 m 对 m_mutex 和 m_bool 的用法感到困惑。我正在寻找的是示例代码或演示。

我已经尝试了所有锁的钥匙,但门似乎仍然锁着。任何帮助都可以。谢谢 !

4

1 回答 1

1

看来,我找到了你想要的。不过我不确定。我的第一个想法是你不明白为什么互斥锁在这里。我先试着解释一下。

在 Windows© 上,当您调用 时WaitForSingleObject(),它会阻止执行,直到您发送信号(或将事件设置为信号状态SetEvent(),在 Windows 术语中)。基本上,它是通过在事件对象中设置一个隐式互斥体,将其锁定在WaitForSingleObject()函数中并等待信号来完成的。

在 POSIX 世界中,您需要显式设置互斥锁。一个重要的通知:没有ResetEvent-link 行为——你不需要重置你的条件变量;但是,您需要解锁互斥锁。可能该ResetEvent()函数的唯一目的是解锁该隐式互斥锁。

void SetEvent(MyEvent evt)
{
    pthread_cond_signal(&evt.m_condition);
}

void ResetEvent(MyEvent evt)
{
    pthread_mutex_unlock(&evt.m_mutex);
}

int WaitForSingleObject(MyEvent evt, unsigned)
{
    pthread_mutex_lock(&evt.m_mutex);
    pthread_cond_wait(&evt.m_condition, &evt.m_mutex);
}

在你的情况下,pthread_cond_signal()更合适。另请注意,您需要使用该pthread_cond_timedwait()功能来模仿该WaitForSingleObject()功能。

进一步阅读:

于 2013-02-19T12:51:59.897 回答