我想在Linux中实现非常简单的Windows事件。仅适用于我的场景 - 3个线程,1个主要和2个辅助。每个辅助线程通过SetEvent引发1个事件,主线程等待它。例如:使用条件变量在Linux中执行Windows事件?
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()。
我们有一个开源的(MIT授权)库,名为'pevents',它在linux上实现了WIN32手动和自动重置事件,并包含WaitForSingleObject和WaitForMultipleObjects克隆:https://github.com/NeoSmart/PEvents –
可能重复的[pthread-like windows手动重置事件](http://stackoverflow.com/questions/178114/pthread-like-windows-manual-reset-event) – jww