मैं सी ++ 11 mutexes ताला देख void lock() volatile
नहीं है। संकलक कैसे जानता है कि कौन से फ़ंक्शन मेमोरी बाधाएं हैं और कौन नहीं हैं? क्या सभी कार्य बाधाएं हैं भले ही वे अस्थिर न हों? कुछ कम ज्ञात मेमोरी बाधाएं और मेमोरी बाधाओं को क्या पता होना चाहिए?सी ++ में मेमोरी बाधाओं के उदाहरण क्या हैं?
उत्तर
क्रम पुस्तकालय एक तरह से एक म्युटेक्स लागू करने के लिए इतना है कि संकलक जानता है! भाषा मानक यह कैसे करने के बारे में कुछ नहीं कहता है।
इसी तरह, यह कुछ ऑपरेटिंग सिस्टम सेवा है कि एक स्मृति बाधा के रूप में काम करता है के लिए एक कॉल शामिल है। या कंपाइलर में एक्सटेंशन हो सकता है, जैसे void _ReadWriteBarrier();
आपके std::mutex
का वास्तविक कार्यान्वयन ऐसा होगा कि संकलक अवैध रीडरिंग नहीं करता है, परिवर्तनीय भार को बढ़ाता नहीं है, और यह सुनिश्चित करेगा कि लॉक चर का उपयोग किया जा सके परमाणु रूप से और सीपीयू लॉक अधिग्रहण और रिलीज के लिए आवश्यक स्मृति बाधाओं को निष्पादित करता है।
कितना काम करने की जरूरत के विवरण इस मंच के लिए मंच से भिन्न सुनिश्चित करने के लिए किया जाना है, लेकिन अपने पुस्तकालय कार्यान्वयन सही काम करेंगे।
मेरा प्रश्न के कैसे संकलक पता है म्युटेक्स में क्या और क्यों यह पहले और ताला के बाद चर को पुन: व्यवस्थित नहीं करता अधिक है? कार्यों को निश्चित रूप से अस्थिर के रूप में चिह्नित नहीं किया जाता है। इसके अलावा मैंने एक बार एमएसवीसी शीर्षकों को देखा और ऐसा लगता है कि यह एक टेम्पलेट नहीं है और lib के माध्यम से जुड़ा हुआ है। तो ... मुझे विश्वास नहीं है कि संकलक के विश्लेषण के लिए यह रेखांकित किया गया है और देखें कि क्या इस * फ़ंक्शन में वर्र्स की आवश्यकता नहीं है ... –
@ acidzombie24: संभवतः, बाहरी फ़ंक्शन कॉल को कभी भी पुन: व्यवस्थित नहीं किया जाएगा कंपाइलर, जैसा कि आप देखते हैं, यह कभी भी सही साबित नहीं हो सकता है। –
यह वास्तव में मंच पर निर्भर करता है। केवल एक कोर के साथ एम्बेडेड सिस्टम के लिए सी ++ कंपाइलर किसी भी प्रकार की मेमोरी बाधा के बिना म्यूटेक्स को कार्यान्वित करने में सक्षम हो सकते हैं, क्योंकि स्मृति हमेशा सुसंगत होती है। –
@BenVoigt, उन्हें अभी भी कंपाइलर निर्देश रीडरिंग को अवरुद्ध करने की आवश्यकता है। –