2008-10-22 19 views
7

मेरे पास एक एमएसएमक्यू कतार की निगरानी करने वाली कई प्रक्रियाएं हैं। मैं मल्टी-स्टेप ऑपरेशंस करना चाहता हूं जैसे पहले संदेश को देखें और फिर कुछ मानदंडों के आधार पर संदेश प्राप्त करें। एक संदेश कई प्रक्रियाओं के प्राप्त मानदंड को पारित कर सकता है ताकि एक से अधिक प्रक्रिया एक ही संदेश प्राप्त करने का प्रयास कर सके। क्या ये ऑपरेशन थ्रेड सुरक्षित होंगे? यदि नहीं, तो मुझे एक प्रक्रिया को उस संदेश को प्राप्त करने में विफल होने से रोकने के लिए क्या करना चाहिए जो अन्य प्रक्रिया पहले ही प्राप्त हो चुकी है?क्या एमएसएमक्यू धागा सुरक्षित है?

उत्तर

5

ऑपरेशन स्वयं धागे सुरक्षित हैं। हालांकि, यदि आप एक बहु-चरण संचालन करते हैं तो आप पाएंगे कि परिणाम सुसंगत नहीं हैं (उदाहरण के लिए, यह देखने के लिए कि डेटा कतार में है या नहीं, फिर डेटा प्राप्त करने के लिए कॉल करना, केवल यह पता लगाने के लिए कि यह अब और नहीं है)।

+2

कृपया ध्यान दें: एमएसडीएन के अनुसार, .NET Framework 4 से आगे, 'केवल GetAllMessages विधि थ्रेड सुरक्षित है'। मैं इसे प्रतिबिंबित करने के उत्तर को अद्यतन करने का सुझाव देता हूं, ताकि पाठकों को भ्रमित नहीं किया जाएगा। – Iravanchi

14

MSDN के अनुसार:

केवल निम्न विधियों धागा सुरक्षित हैं: BeginPeek, BeginReceive, EndPeek (IAsyncResult), EndReceive (IAsyncResult), GetAllMessages, पीक, और प्राप्त करें।

+6

कृपया ध्यान दें कि MessageQueue के लिए दस्तावेज़ के .Net 4 संस्करण में कहा गया है कि केवल GetAllMessages() थ्रेड सुरक्षित है। मुझे लगता है कि यह एक वास्तविक परिवर्तन है क्योंकि ग़लत दस्तावेज संभवतः .Net 4 दस्तावेज़ों के साथ ऑनलाइन अपडेट किया गया है। – redcalx

+1

उल्लेखनीय रूप से भेजें() विधि मेरे यूनिट परीक्षण में थ्रेड सुरक्षित नहीं पाया गया था, संदेशक्यूयू ऑब्जेक्ट पर लॉकिंग, विभिन्न समानता आदि अपवादों को हल किया गया जो मेरे समांतर लूप में फेंक रहे थे। – Kaido

+0

@Kaido: अनलॉक किया गया 'MessageQueue.Send()' त्रुटियों में परिणाम? या आपने जिस व्यवहार का अनुभव किया था? –

6

आपको इस विषय पर blog entry में रुचि हो सकती है।

संक्षेप में, एमएसएमक्यू सी ++ एपीआई थ्रेड सुरक्षित है, लेकिन सभी सिस्टम नहीं। मैसेजिंग विधियां थ्रेड सुरक्षित हैं। ब्लॉग एंट्री में मैं चर्चा करता हूं कि MessageQueue को कैसे कॉल करें। थ्रेड-सुरक्षित तरीके से भेजें।

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