उत्तर
Herb Sutter बस जैसे डॉ डोब्स जर्नल में उसकी प्रभावी Concurency स्तंभ के हिस्से के रूप एक कतार कवर वहाँ किसी भी सी ++ कार्यान्वयन (स्रोत कोड) है।
आप अगर ' माइक्रोसॉफ्ट विजुअल स्टूडियो 2010 & इंटेल के थ्रेड बिल्डिंग ब्लॉक्स में एक अच्छी लॉक फ्री कतार कार्यान्वयन की तलाश है, जो एक अच्छी एलएफ कतार है जो पेपर के समान है।
मैं greyfade, जो http://www.drdobbs.com/high-performance-computing/212201163 (लेख के अंतिम भाग) पर आधारित है द्वारा दिए गए जवाब है, अनुकूलित कोड होगा (कुछ संशोधन मेरी नामकरण और कोडिंग सम्मेलन सूट करने के लिए) के साथ समाप्त करने के लिए चाहते हैं : `
template <typename T> class LFQueue {
private:
struct LFQNode {
LFQNode(T* val) : value(val), next(nullptr) { }
T* value;
AtomicPtr<LFQNode> next;
char pad[CACHE_LINE_SIZE - sizeof(T*) - sizeof(AtomicPtr<LFQNode>)];
};
char pad0[CACHE_LINE_SIZE];
LFQNode* first; // for one consumer at a time
char pad1[CACHE_LINE_SIZE - sizeof(LFQNode*)];
InterlockedFlag consumerLock; // shared among consumers
char pad2[CACHE_LINE_SIZE - sizeof(InterlockedFlag)];
LFQNode* last; // for one producer at a time
char pad3[CACHE_LINE_SIZE - sizeof(LFQNode*)];
InterlockedFlag producerLock; // shared among producers
char pad4[CACHE_LINE_SIZE - sizeof(InterlockedFlag)];
public:
LFQueue() {
first = last = new LFQNode(nullptr); // no more divider
producerLock = consumerLock = false;
}
~LFQueue() {
while(first != nullptr) {
LFQNode* tmp = first;
first = tmp->next;
delete tmp;
}
}
bool pop(T& result) {
while(consumerLock.set(true))
{ } // acquire exclusivity
if(first->next != nullptr) { // if queue is nonempty
LFQNode* oldFirst = first;
first = first->next;
T* value = first->value; // take it out
first->value = nullptr; // of the Node
consumerLock = false; // release exclusivity
result = *value; // now copy it back
delete value; // and clean up
delete oldFirst; // both allocations
return true; // and report success
}
consumerLock = false; // release exclusivity
return false; // queue was empty
}
bool push(const T& t) {
LFQNode* tmp = new LFQNode(t); // do work off to the side
while(producerLock.set(true))
{ } // acquire exclusivity
last->next = tmp; // A: publish the new item
last = tmp; // B: not "last->next"
producerLock = false; // release exclusivity
return true;
}
};
`
एक और सवाल यह है कि आप CACHE_LINE_SIZE परिभाषित करते है? यह हमेशा सीपीयू पर भिन्न होता है?
चुनने के लिए एक अच्छी संख्या होगी मुझे लगता है कि '64' बाइट्स हो। लेकिन आप शायद इसे आकार के साथ संतुलित करना चाहते हैं, इसलिए मैं आपके लक्षित सीपीयू को देखने का सुझाव दूंगा और एक ऐसा आकार चुनूंगा जो आपके द्वारा लक्षित करने की अपेक्षा रखने वाले सबसे आम लोगों को फिट करे। – greyfade
बस एक त्वरित नोट: यह एक मंच नहीं है, इसलिए लोगों को "थ्रेड ब्राउज़" करने के लिए नहीं माना जा सकता है। यदि आप एक और सवाल पूछना चाहते हैं, तो आपको "आपका उत्तर" के बजाय "प्रश्न पूछें" फ़ील्ड का बेहतर उपयोग करना चाहिए। –
मैं वास्तव में सवाल का जवाब दे रहा हूं, लेकिन मैं उत्तर क्षेत्र में पूछने में गलत था, मुझे अपने नए उत्तर के तहत नई टिप्पणी जोड़नी चाहिए। उसके लिए माफ़ करना। – uray
यहां लॉक-फ्री फीफो का मेरा कार्यान्वयन है।
सुनिश्चित करें कि टी की प्रत्येक वस्तु झूठी साझाकरण से बचने के लिए 64 बाइट्स (इंटेल CPUs में कैश लाइन आकार) का एक बहु है।
यह कोड gcc/mingw के साथ संकलित करता है और क्लैंग के साथ संकलित होना चाहिए। इसे 64-बिट के लिए अनुकूलित किया गया है, इसलिए इसे 32-बिट पर चलाने के लिए कुछ रिफैक्टरिंग की आवश्यकता होगी।
https://github.com/vovoid/vsxu/blob/master/engine/include/vsx_fifo.h
vsx_fifo<my_struct, 512> my_fifo;
प्रेषक:
my_struct my_struct_inst;
... fill it out ...
while (!my_fifo.produce(my_struct_inst)) {}
रिसीवर:
my_struct my_struct_recv;
while(my_fifo.consume(my_struct_recv))
{
...do stuff...
}
जैसा कि मैंने देखा, यह थ्रेड सुरक्षित है लेकिन पुनर्वित्त नहीं है। – peterh
- 1. फीफो आधारित कतार कार्यान्वयन?
- 2. फीफो प्रतीक्षा कतार
- 3. NSOperationQueue सीरियल फीफो कतार
- 4. क्या आईफोन के लिए कोई कतार/फीफो डेटा संरचना है?
- 5. लॉकफ्री एल्गोरिदम का उपयोग कर क्लोजर लॉकफ्री है?
- 6. मल्टीथ्रेडेड सिंगल-रीडर एकल-लेखक फीफो कतार
- 7. ब्रॉडल प्राथमिकता कतार कार्यान्वयन
- 8. क्या एक क्रमबद्ध कतार .NET में मौजूद है?
- 9. जावा में फीफो कक्षा
- 10. लॉकलेस कतार कार्यान्वयन समाप्त होता है तनाव
- 11. कतार के लिए प्रतीक क्या है?
- 12. जावा कतार कार्यान्वयन, कौन सा?
- 13. क्या यह (लॉक-फ्री) कतार कार्यान्वयन थ्रेड-सेफ है?
- 14. जावा कतार का सर्वोत्तम कार्यान्वयन?
- 15. फीफो
- 16. जेपीए में आशावादी ताला क्या है?
- 17. क्या सी के लिए मानक कतार कार्यान्वयन हैं?
- 18. कैलेंडर कतार क्या है?
- 19. एक निश्चित आकार की फीफो कतार के लिए सही शब्द क्या है?
- 20. क्या लॉकफ्री सेटिंग में एकाधिक-निर्माता, सिंगल-उपभोक्ता संभव है?
- 21. क्या एक सेट करने योग्य nthcdr कार्यान्वयन मौजूद है?
- 22. जावा में एक हैंडलबर्स.जेएस कार्यान्वयन मौजूद है?
- 23. फीफो रोकें बंद कर दिया फीफो
- 24. फीफो क्यूईंग सिस्टम में, प्राथमिकता संदेश
- 25. क्या जीएई में पुल क्यूई लगातार फीफो व्यवहार प्रदर्शित करता है?
- 26. क्या डेल्फी के लिए लॉक-फ्री कतार "एकाधिक उत्पादक-एकल उपभोक्ता" मौजूद है?
- 27. आशावादी कैशिंग Concurrency डिजाइन पैटर्न
- 28. बूस्ट के साथ परेशानी :: लॉकफ्री :: साझा मेमोरी में कतार (बूस्ट 1.53, जीसीसी 4.7.2/क्लैंग 3.0-6ubuntu3)
- 29. क्या सी ++ के लिए एक से अधिक उत्पादक एकल उपभोक्ता लॉक-फ्री कतार मौजूद है?
- 30. समवर्ती सेट कतार
है कि सिद्धांत, क्या i'am पूछने कार्यान्वयन है। क्या कोई स्रोत कोड या लाइब्रेरी है जो उन एल्गोरिदम को लागू करती है? – uray
@uray: हां। लेख में। – greyfade
कहां? मुझे वहां कोई स्रोत कोड फाइल नहीं दिख रही है। – uray