我有一个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_mutex和m_bool的使用感到困惑。我正在寻找的是示例代码或演示。
我已经尝试了所有钥匙锁,但似乎门仍然锁着。任何帮助都可以。谢谢!
答案 0 :(得分:1)
看来,我找到了你想要的东西。我不确定。我的第一个想法是你不明白为什么互斥锁在这里。我会先尝试解释一下。
在Windows©上,当您调用WaitForSingleObject()
时,它会阻止执行,直到您发送信号(或以Windows为术语设置信号状态SetEvent()
的事件)。基本上,它是通过在事件对象中设置隐式互斥锁,将其锁定在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()
函数。
进一步阅读: