कार्रवाई करने के लिए यहाँ कैसे एक lock- लिखने के लिए है एक आइटम नहीं होने तक, धागा इंतजार करना चाहिए सी ++ में मुफ्त कतार:
http://www.ddj.com/hpc-high-performance-computing/210604448
लेकिन जब आप कहते हैं कि "धागा एक ब्लॉक नहीं चाहिए", तो आप यह सुनिश्चित करें कि आवश्यकता नहीं है कर रहे हैं? विंडोज एक वास्तविक समय ऑपरेटिंग सिस्टम नहीं है (और न ही सामान्य उपयोग में लिनक्स है)। यदि आप थ्रेड ए को सभी उपलब्ध सिस्टम मेमोरी का उपयोग करने में सक्षम होना चाहते हैं, तो इसे स्मृति आवंटित करने की आवश्यकता है (या किसी और के दौरान प्रतीक्षा करें)। यदि ओएस सूची में हेरफेर करने के लिए दोनों पाठक और लेखक ने इन-प्रोसेस लॉक (यानी एक गैर-साझा म्यूटेक्स) लिया है, तो ओएस स्वयं उन समय की तुलना में बेहतर गारंटी प्रदान नहीं कर सकता है। और संदेश जोड़ने का सबसे बुरा मामला स्मृति प्राप्त करने के लिए ओएस पर जाना होगा।
संक्षेप में, उन पंक्तियों का एक कारण है जिन्हें आप पसंद नहीं करते हैं - यह इसलिए है कि उन्हें अनुमानित कम-विलंबता धागे में स्मृति आवंटित करने की आवश्यकता नहीं है।
तो लॉक-फ्री कोड आम तौर पर कम ब्लॉक-वाई होगा, लेकिन स्मृति आवंटन के कारण इसकी गारंटी नहीं है, और एक म्यूटेक्स के साथ प्रदर्शन तब तक नहीं होना चाहिए जब तक कि आपके पास वास्तव में विशाल न हो प्रक्रियाओं की प्रक्रिया को संसाधित करने के लिए (जैसे, आप एक नेटवर्क ड्राइवर लिख रहे हैं और संदेश आने वाले ईथरनेट पैकेट हैं)।
तो, छद्म कोड में, पहली बात मैं कोशिश करेंगे:
Writer:
allocate message and fill it in
acquire lock
append node to intrusive list
signal condition variable
release lock
Reader:
for(;;)
acquire lock
for(;;)
if there's a node
remove it
break
else
wait on condition variable
endif
endfor
release lock
process message
free message
endfor
सिर्फ अगर इस लेखक सूत्र में अस्वीकार्य देरी लागू करने के लिए साबित होता है मैं ताला मुक्त कोड जाती थी, (जब तक कि मेरे पास एक उपयुक्त कतार पहले से ही झूठ नहीं बोलती)।
स्रोत
2009-09-19 10:58:50
आप किस थ्रेडिंग लाइब्रेरी का उपयोग कर रहे हैं? pthreads? –
बूस्ट :: थ्रेड और प्लेटफार्म के कुछ बिट्स यहां निर्दिष्ट कोड –
आपका लक्ष्य स्मृति से बाहर हो सकता है क्योंकि आप लेखक थ्रेड को ब्लॉक या ड्रॉप करने की अनुमति नहीं देते हैं। इसलिए यदि आप कतार की महत्वपूर्ण आकार सीमा तक पहुंचते हैं तो आपको यह तय करना होगा कि आइटम ड्रॉप करना है या लेखक धागे को अवरुद्ध करना है या नहीं। अन्यथा आप अप्रत्यक्ष रूप से आइटम ड्रॉप करते हैं क्योंकि आपका प्रोग्राम विफल रहता है :-) – mmmmmmmm