मैं लिनक्स में बहुत ही सरल विंडोज़ इवेंट्स को लागू करने की कोशिश कर रहा हूं। केवल मेरे परिदृश्य के लिए - 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 से पहले मुख्य सूत्र में समारोह बुलाया जाएगा। विंडोज़ में, यह अच्छी तरह से काम करता था, लेकिन लिनक्स में - केवल विचार ऊपर वर्णित है।
शायद आप इसे हल करने का बेहतर तरीका बता सकते हैं? धन्यवाद।
यूपीडी: टाइमआउट बहुत महत्वपूर्ण है, क्योंकि माध्यमिक धागे में से एक SetEvent() को पास नहीं कर सकता है।
हमारे पास 'पेवेंट्स' नामक एक ओपन सोर्स (एमआईटी-लाइसेंसीकृत) लाइब्रेरी है जो लिनक्स पर WIN32 मैनुअल और ऑटो-रीसेट इवेंट लागू करती है, और इसमें WaitForSingleObject और WaitForMultipleObjects क्लोन दोनों शामिल हैं: https://github.com/NeoSmart/PEvents –
[pthread- जैसे विंडोज मैनुअल-रीसेट इवेंट] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/178114/pthread-like- विन्डोज़- मैनुअल-reset-event) – jww