2012-06-05 13 views
13

सबसे पहले, मुझे लगता है कि std :: chrono के किसी भी फ़ंक्शन को कॉल करना थ्रेड-सुरक्षित होने की गारंटी है (कोई अपरिभाषित व्यवहार या दौड़ की स्थिति या अलग-अलग धागे से बुलाए जाने वाले खतरनाक कुछ भी नहीं)। क्या मैं सही हूँ?क्या मल्टीकोर संदर्भ के साथ भी कोई std :: chrono thread सुरक्षा गारंटी है?

अगला, उदाहरण के लिए on windows there is a well known problem related to multi-core processors जो some implementations of time related systems to allow forcing a specific core to get any time information को मजबूर करता है।

क्या मैं जानना चाहता हूँ है:

  1. का उपयोग कर std :: chrono मानक में, वहाँ किसी भी गारंटी नहीं है कि लगता है कि समस्या की तरह दिखाई नहीं चाहिए?
  2. या यह कार्यान्वयन
  3. परिभाषित किया गया है या क्या गारंटी की एक स्पष्ट अनुपस्थिति है जो दर्शाती है कि विंडोज़ पर आप हमेशा एक ही कोर से समय प्राप्त करेंगे?
+1

KB लेख एक हार्डवेयर की समस्या का वर्णन करता है कि कर रहे हैं। इसका विशेष रूप से विंडोज़ के साथ कुछ लेना देना नहीं है। वही समस्या * किसी * ओएस पर होगी जो उस हार्डवेयर टाइमर का उपयोग करती है। और नहीं, सी ++ मानक में कुछ भी नहीं कह रहा है कि "यदि आप दुर्लभ दोषपूर्ण हार्डवेयर पर अपना कोड चलाते हैं तो इस वर्ग को बुरी तरह व्यवहार करने की अनुमति है"। – jalf

+0

मेरी समझ यह है कि समस्या केवल विंडोज पर होती है? वैसे भी, आपका जवाब क्यों हटा रहा है? साथ ही, यह उन सभी बिंदुओं का उत्तर नहीं देता जो मैं पूछता हूं। – Klaim

+0

देखें कि केबी आलेख क्या कहता है: "यह ऑपरेटिंग सिस्टम का व्यवहार डिज़ाइन द्वारा है। ऑपरेटिंग सिस्टम चिपसेट से अविश्वसनीय डेटा प्राप्त करते समय प्रदर्शन काउंटर समायोजन आवश्यक है।" यह किसी भी ओएस पर हो सकता है।माइक्रोसॉफ्ट बस इसे दस्तावेज करता है क्योंकि लोगों ने अक्सर एक KB आलेख को वारंट करने के लिए पर्याप्त रूप से सामना किया है (आंशिक रूप से क्योंकि विंडोज व्यापक रूप से उपयोग किया जाता है, और आंशिक रूप से क्योंकि इसका व्यापक रूप से गेम के लिए उपयोग किया जाता है, उच्च-रिज़ॉल्यूशन टाइमर अधिक बार उपयोग किए जाते थे) – jalf

उत्तर

5

हां, विभिन्न धागे से some_clock::now() पर कॉल थ्रेड सुरक्षित होना चाहिए।

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

जहां तक ​​सी ++ मानक का संबंध है, अगर घड़ी "स्थिर घड़ी" होने का दावा करती है तो इसे कभी पीछे नहीं जाना चाहिए, इसलिए यदि एक ही थ्रेड पर दो पढ़े जाते हैं, तो दूसरे को पहले कभी वैल्यू नहीं लौटा देना चाहिए पहले की तुलना में, ओएस भी थ्रेड को एक अलग प्रोसेसर में बदल देता है।

गैर-स्थिर घड़ियों (जैसे std::chrono::system_clock कई प्रणालियों पर) के लिए, इसके बारे में कोई गारंटी नहीं है, क्योंकि बाहरी एजेंट घड़ी को मनमाने ढंग से बदल सकता है।

my implementation of the C++11 thread library (std::chrono सामान सहित) कार्यान्वयन यह सुनिश्चित करने के लिए सावधानी बरतता है कि स्थिर घड़ियों वास्तव में स्थिर हैं। यह सिंक्रनाइज़ेशन सुनिश्चित करने के लिए QueryPerformanceCounter पर कच्चे कॉल के ऊपर और ऊपर लागत लगाता है, लेकिन अब थ्रेड को CPU 0 (जो इसे करने के लिए उपयोग किया जाता है) को पिन नहीं करता है। मैं उम्मीद करता हूं कि इस मुद्दे के लिए अन्य कार्यान्वयनों के लिए कामकाज भी होगा।

एक स्थिर घड़ी के लिए आवश्यकताओं को 20.11.3 [time.clock.req] (सी ++ 11 मानक)

+0

मैं इस उत्तर को स्वीकार करता हूं क्योंकि यह कहता है कि steady_clock कभी पिछड़ा नहीं होना चाहिए, यही वह है जो मुझे अंत में जानने की जरूरत है। हालांकि, यदि आप मानक के संदर्भ जोड़ सकते हैं, तो यह बहुत अच्छा होगा। इसके अलावा, मैं आपको पहले नहीं पूछने के लिए बेवकूफ हूं, आप मेलिंग सूची में हैं और मैं आपकी पुस्तक के बीच में हूं ... एक्सडी – Klaim

+1

स्थिर घड़ी की आवश्यकताएं 20.11.3 [time.clock में हैं। req] –

+0

क्या किसी को पता है कि std :: chrono :: steady_clock :: time_point "उचित रूप से अपेक्षित" है जो एक नए मूल्य के साथ पिछले मान को रीसेट करते समय एक परमाणु चर के रूप में अच्छा होता है (जबकि समवर्ती रूप से किसी अन्य धागे से पढ़ा जा रहा है) – Ghita

-1

मैं ईमानदारी से मानता हूं कि इस प्रश्न का पालन कथन द्वारा पूरी तरह से उत्तर दिया गया है: इस बात की कोई गारंटी नहीं है कि कार्यान्वयन में प्लेटफ़ॉर्म-विशिष्ट बग नहीं होंगे। यह सब पूरी तरह से काम करने के लिए माना जाता है, लेकिन कभी-कभी किसी कारण या किसी अन्य के लिए यह नहीं करता है। कोई भी आपको वादा नहीं कर सकता कि वह वही करेगा जो आप चाहते हैं, लेकिन यह काम करना चाहिए।

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