Tôi đang cố triển khai các sự kiện Windows rất đơn giản trong Linux. Chỉ cho kịch bản của tôi - 3 chủ đề, 1 chính và 2 phụ. Mỗi chủ đề thứ cấp tăng 1 sự kiện bằng SetEvent và chủ đề chính chờ đợi nó. Ví dụ:Windows Sự kiện triển khai trong Linux bằng các biến có điều kiện?
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
}
Vì vậy, để triển khai, tôi sử dụng các biến điều kiện. Nhưng câu hỏi của tôi là - đây có phải là cách đúng đắn không? Hay tôi làm gì sai? Triển khai của tôi:
// 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);
Và tất cả có vẻ tốt, nhưng tôi nghĩ, sự cố đó sẽ xuất hiện khi tôi gọi hàm WaitFor .. trong chuỗi chính trước khi SetEvent trong chuỗi phụ sẽ được gọi. Trong Windows, nó hoạt động tốt, nhưng trong Linux - ý tưởng duy nhất được mô tả ở trên.
Có thể bạn cho tôi biết cách tốt hơn để giải quyết nó? Cảm ơn bạn.
UPD: Hết thời gian chờ là rất quan trọng, vì một trong các chuỗi phụ không thể vượt qua SetEvent().
Chúng tôi có thư viện mã nguồn mở (gọi là MIT) được gọi là 'pevents', thực hiện các sự kiện thủ công và tự động đặt lại WIN32 trên Linux, và bao gồm cả hai dòng WaitForSingleObject và WaitForMultipleObjects: https://github.com/NeoSmart/PEvents –
có thể trùng lặp của [sự kiện đặt lại hướng dẫn sử dụng cửa sổ giống như pthread] (http://stackoverflow.com/questions/178114/pthread-like-windows-manual-reset-event) – jww