Implementação de eventos do Windows no Linux usando variáveis condicionais?
Eu estou tentando implementar eventos muito simples do Windows no Linux. Apenas para o meu cenário - 3 tópicos, 1 principal e 2 secundários. Cada um dos encadeamentos secundários gera um evento por SetEvent e o encadeamento principal o aguarda. Exemplo:
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
}
Então, para implementá-lo, eu uso variáveis condicionais. Mas a minha pergunta é - este é um caminho certo? Ou eu fazendo algo errado? Minha implementação:
// 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);
E tudo parece bom, mas eu acho que o problema aparecerá quando eu chamar WaitFor .. função no segmento principal antes de SetEvent no segmento secundário será chamado. No Windows, funcionou bem, mas no Linux - apenas a ideia é descrita acima.
Talvez você me diga a melhor maneira de resolvê-lo? Obrigado.
UPD: Tempo limite é muito importante, porque um dos segmentos secundários não pode passar SetEvent ().