मैं एक मास्टर थ्रेड और कुछ वर्कर थ्रेड के साथ एक प्रोग्राम लिख रहा हूं, और मैं सिग्नल हैंडलिंग सही प्राप्त करना चाहता हूं।मास्टर/वर्कर थ्रेड और सिग्नल हैंडलिंग
मास्टर धागा शुरू होता है और सभी आवंटन
मास्टर धागा एक SIGINT संकेत हैंडलर
मास्टर धागे कार्यकर्ता धागे शुरू सेट करना: मेरी समस्या निम्नलिखित है। कार्यकर्ता धागे को विशेष सफाई की आवश्यकता नहीं है, हालांकि वे सिस्टम कॉल या सेमफोर पर सो सकते हैं।
जब SIGINT प्राप्त होता है, मेरी समझ यह है कि केवल एक धागा इसे प्राप्त करता है। तो यदि थ्रेड सिस्टम कॉल या सेमफोर पर सो रहे हैं, तो वे जागृत नहीं होंगे, और मैं pthread_join मेरे वर्कर थ्रेड में सक्षम नहीं होगा और मेरे मास्टर थ्रेड में सभी आवश्यक क्लीनअप कर पाऊंगा।
क्या निम्न सिग्नल हैंडलर मेरी समस्या का समाधान कर सकता है?
void term(int sig)
{
g_do_cleanup = 1;
pthread_kill(worker_1_id, some_other_signal);
...
pthread_kill(worker_2_id, some_other_signal);
}
क्या मैं उम्मीद करते हैं कि SIGINT प्राप्त होने पर, सभी धागा एक और संकेत के साथ संकेत दिया हो जाएगा, उनके अवरुद्ध कॉल से बाहर निकलना, g_do_cleanup
झंडा और शान से बाहर निकलने के देखते हैं।
किसी भी टिप्पणी या लिंक को ठीक से कैसे किया जाए इसका स्वागत है।
संपादित करें: मैं किसी विशेष स्थिति पर प्रतीक्षा करने वाले एकाधिक थ्रेड को जगाने के लिए कोई रास्ता नहीं ढूंढ रहा हूं, इसलिए मुझे नहीं लगता कि pthread_cond_signal दृष्टिकोण वह है जिसे मैं ढूंढ रहा हूं। क्या मैं चाहता हूँ है:
- कि सभी धागे कि एक अवरुद्ध कॉल पर अवरुद्ध कर रहे हैं देता है इन कॉल से एक रास्ता खोजें।
- या मुख्य धागे को छोड़कर सभी धागे को मार दें।
हाँ।अधिकतर लोग – Kieveli
धागे करने के लिए pthread या Win32/MFC कार्यान्वयन का उपयोग करते हैं, नहीं, मुझे नहीं लगता कि यह ठीक है, क्योंकि यह मुझे अवरुद्ध चयन कॉल, या sem_wait कॉल से नहीं जगाएगा। शायद मैं अपने सेफफोर्स को एक pthread_condition के साथ प्रतिस्थापित कर सकता हूं, लेकिन सेमफोर अबास्ट्रक्शन वास्तव में मेरे सिंक्रनाइज़ेशन मॉडल को फिट करता है। – shodanex