【发布时间】:2012-10-13 09:11:54
【问题描述】:
我正在尝试在 Linux 中实现非常简单的 Windows 事件。仅适用于我的场景 - 3 个线程,1 个主线程和 2 个辅助线程。每个辅助线程通过 SetEvent 引发 1 个事件,主线程等待它。示例:
int main()
{
void* Events[2];
Events[0] = CreateEvent();
Events[1] = CreateEvent();
pthread_start(Thread, Events[0]);
pthread_start(Thread, Events[1]);
WaitForMultipleObjects(2, Events, 30000) // 30 seconds timeout
return 0;
}
int* thread(void* Event)
{
// Do something
SetEvent(Event);
// Do something
}
所以,为了实现它,我使用条件变量。但我的问题是 - 这是正确的方法吗?还是我做错了什么?我的实现:
// Actually, this function return pointer to struct with mutex and cond
// here i just simplified example
void* CreateEvent(mutex, condition)
{
pthread_mutex_init(mutex, NULL);
pthread_cond_init(condition, NULL);
}
bool SetEvent (mutex, condition)
{
pthread_mutex_lock(mutex);
pthread_cond_signal(condition);
pthread_mutex_unlock(mutex);
}
int WaitForSingleObject(mutex, condition, timeout)
{
pthread_mutex_lock(mutex);
pthread_cond_timedwait(condition, mutex, timeout);
pthread_mutex_unlock(mutex);
}
// Call WaitForSingleObject for each event.
// Yes, i know, that its a wrong way, but it should work in my example.
int WaitForMultipleObjects(count, mutex[], condition[], timeout);
一切似乎都很好,但我认为,当我在主线程中调用 WaitFor.. 函数时,会出现该问题,然后调用辅助线程中的 SetEvent。在 Windows 中,它运行良好,但在 Linux 中 - 上面仅描述了想法。
也许你能告诉我更好的解决方法?谢谢。
UPD:超时非常重要,因为其中一个辅助线程可能不会通过 SetEvent()。
【问题讨论】:
-
我们有一个名为
pevents的开源(MIT 许可)库,它在 Linux 上实现 WIN32 手动和自动重置事件,并包括 WaitForSingleObject 和 WaitForMultipleObjects 克隆:github.com/NeoSmart/PEvents
标签: c++ linux multithreading synchronization mutex