c-将WIN32应用程序移植到Linux-事件在Linux中如何工作



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

首先,我创建了一个实现event的结构。

typedef struct _Event
   {
      int m_bool;
      pthread_mutex_t m_mutex;
      pthread_cond_t m_condition;
   }MyEvent, * Event_handle;

为了实现"SetEvent"、"ResetEvent"one_answers"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_mutex和m_bool的用法感到困惑。我要找的是一个示例代码或演示。

我把所有的钥匙都试过了,但门好像还锁着。任何帮助都可以。谢谢!

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

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

在POSIX世界中,您需要显式地设置互斥对象。一个重要的注意事项是:不存在ResetEvent-链接行为——您不需要重置条件变量;但是,您需要解锁互斥锁。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()函数。

进一步阅读:

  • man pthread_cond_wait
  • 人pthread_cond_signal

最新更新