2013-02-19 99 views
1

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

首先,我创建了一个实现事件的结构。为了实现'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_mutex和m_bool的用法感到困惑。我正在寻找的是一个示例代码或演示。

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

+0

为什么你需要'm_bool'? – 2013-02-19 10:11:55

+0

我保留它的事件状态。我可以检查m_bool以确定事件是否已设置。 – 2013-02-19 10:12:56

+0

您是否从Windows Mobile的应用程序移植? – 2013-02-19 10:16:09

回答

1

看来,我找到了你想要的东西。虽然我不确定。我的第一个想法是你不明白为什么互斥体在这里。我会先尝试解释它。

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

在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()函数。

延伸阅读:

+0

是的,我实际上对互斥体的用法感到困惑......而你在答案中所说的是有道理的..我试了一下。非常感谢你的输入! :-) – 2013-02-20 04:31:00

相关问题