मुझे इस पर थोड़ी देर हो सकती है।
समाधानों की अनुपस्थिति (सवाल पूछा गया था) मुख्य रूप से C ++ में महत्वपूर्ण मुद्दे (C ++ 0x / 11 से पहले) के कारण हैं: C ++ के पास कोई समवर्ती मेमोरी मॉडल नहीं है।
अब, std :: atomic का उपयोग करके, आप मेमोरी ऑर्डरिंग मुद्दों को नियंत्रित कर सकते हैं और उचित तुलना-और-स्वैप ऑपरेशन कर सकते हैं। मैंने स्वयं को जल्दी मुक्त और ABA समस्याओं से बचने के लिए C ++ 11 और Micheal's Hazard Pointers (IEEE TPDS 2004) का उपयोग करके माइकल और स्कॉट की लॉक-फ्री कतार (PODC96) का कार्यान्वयन स्वयं लिखा है। यह ठीक काम कर रहा है लेकिन यह एक त्वरित और गंदा कार्यान्वयन है और मैं वास्तविक प्रदर्शन से संतुष्ट नहीं हूं। कोड बिटबकेट पर उपलब्ध है: LockFreeExperiment
डबल-पॉइंट CAS (लेकिन 64 बिट संस्करण केवल c86xchg16b का उपयोग करके x86-64 पर संभव होगा) के बिना लॉक-फ्री कतार को लागू करना संभव है, मैं इस बारे में एक ब्लॉग पोस्ट (कतार के लिए बिना कोड वाला) कर रहा हूं : X86 / x86-64 (LSE ब्लॉग) के लिए जेनेरिक डबल-शब्द की तुलना करें और स्वैप करें ।
मेरे अपने बेंचमार्क ने मुझे दिखाया कि डबल-लॉक कतार (मिचेल और स्कॉट 1996 के पेपर में भी) और साथ ही लॉक-फ्री एक भी करता है (मैं पर्याप्त विवाद तक नहीं पहुंचा हूं, ताकि लॉक किए गए डेटा संरचनाओं में प्रदर्शन के मुद्दे हों, लेकिन मेरी बेंच के लिए बहुत हल्का है अब) और इंटेल के टीबीबी से समवर्ती कतार अपेक्षाकृत छोटी संख्या (ऑपरेटिंग सिस्टम के आधार पर, फ्रीबीएसडी 9 के तहत सबसे कम बाध्य है) के लिए और भी बेहतर (दो बार तेज) लगता है, यह संख्या अब तक 8 थ्रेड है। धागे के 4 ht- कोर के साथ i7, और इस तरह 8 तार्किक सीपीयू) और बहुत ही अजीब व्यवहार (सेकंड से घंटे तक मेरे सरल बेंचमार्क चाल का निष्पादन समय है!)
एसटीएल शैली के बाद लॉक-फ्री कतारों के बारे में एक और सीमाएं: लॉक-फ्री कतार पर पुनरावृत्त होने का कोई मतलब नहीं है।