2009-05-05 36 views
5

दूसरे शब्दों में मेरे पास एक धागा है जो waitHandle.Set() कई बार शुरू होता है और कॉल करता है। फिर मैं कई धागे शुरू करता हूं और प्रत्येक WaitHandle पर इंतजार कर रहा है। क्या उनमें से एक्स को संकेत दिया जाएगा कि एक्स waitHandle.Set() नामक मूल धागे की संख्या है?यदि आप EventWaitHandle.Set() X बार कॉल करते हैं, तो क्या एक्स एक्स थ्रेड्स को सिग्नल करेगा यदि एक्स थ्रेड अभी तक शुरू नहीं हुआ है?

क्या ऐसी कोई संरचना है जो मैं और अधिक बारीकी से पूरा करने की कोशिश कर रहा हूं?

उत्तर

9

शायद, लेकिन शायद नहीं।

किसी ईवेंट को केवल सेट या अनसेट किया जा सकता है, यदि ईवेंट को अनसेट करने के लिए कुछ भी नहीं है तो सेट पर बार-बार कॉल उसकी स्थिति नहीं बदलेगी, जब तक कि यह एक ऑटो-रीसेट ईवेंट न हो और कम से कम एक थ्रेड उस पर प्रतीक्षा कर रहा हो । मैन्युअल रीसेट ईवेंट के साथ किसी थ्रेड प्रतीक्षा (या प्रतीक्षा करने के लिए) जारी किया जाएगा जब तक कि कुछ घटना को अनदेखा न करे।

मुझे लगता है कि आप वास्तव में एक सेमाफोर है, जो एक गिनती है और n धागे जारी करने के लिए (भले ही उन धागे में से कुछ केवल कॉल के कुछ स्थापित करने के लिए के बाद इंतजार कर शुरू) n बार की स्थापना का समर्थन करता है चाहते हैं।

+0

हां मैं एक सेमफोर चाहता हूँ। मुझे इसके मैकेनिक्स याद आया, लेकिन नाम नहीं। यह थोड़ी देर हो गया है क्योंकि मैंने संसाधन पूल के लिए निम्न-स्तरीय थ्रेडिंग कोड लिखा है। –

3

यह EventResetMode पर निर्भर करता है। यदि यह EventResetMode.AutoReset पर सेट है तो यह केवल एक थ्रेड जारी करेगा। यदि यह 'EventResetMode.ManualReset' है, तो यह ईवेंट पर अवरुद्ध सभी थ्रेड जारी करेगा।

Semaphore.Release(Int) 

कहाँ इंट गिनती होगी एक तरीका यह है है।

+0

क्या एक्स थ्रेड जारी करने का कोई तरीका नहीं है जहां एक्स 'WaitHandle.Set()' को कॉल किया गया था? –

+0

हां। इसे ऑटो के रूप में बनाएं। तुम क्या करने की कोशिश कर रहे हो? मुझे यकीन है कि अगर आप कुछ और जानकारी प्रदान कर सकते हैं तो एक बेहतर तरीका है। जैसा कि नीचे बताया गया है आप एक सेमफोर का भी उपयोग कर सकते हैं लेकिन कुछ गड़बड़ कर देता है। –

+0

नहीं, एक ऑटो-रीसेट ईवेंट यहां उचित नहीं है। आप उस थ्रेड पर भरोसा कर रहे हैं जो सेट करने के लिए सेट है केवल इसे कॉल करें। यदि किसी भी धागे की प्रतीक्षा से संतुष्ट होने से पहले घटना दो बार सेट हो जाती है, तो केवल एक प्रतीक्षा धागा चलाना पड़ता है। –

1

जैसा कि रिचर्ड ने कहा, EventWaitHandles में केवल एक झंडा है और सेट की संख्या को गिनने की संख्या की गणना नहीं कर सकता है। एक गिनती चर जोड़ने का सरल समाधान एक दौड़ की स्थिति का कारण बनता है।

विलियम केम्प के पास article है, क्यों गिनती चर काम नहीं करते हैं, और नेट मॉनिटर क्लास का उपयोग करके समाधान।

संबंधित मुद्दे