gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:46 25 4
gpt4 key购买 nike

我有一个 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 的用法感到困惑。我正在寻找的是示例代码或演示。

我试过了所有的 key ,但门似乎还是锁着的。任何帮助都可以。谢谢!

最佳答案

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

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

进一步阅读:

关于c - 将 WIN32 应用程序移植到 Linux - 事件在 Linux 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14954798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com