2012-06-28 19 views
5

बहुत समय पहले मेरे कार्यक्रम में एक बग था। मूल कारण यह था कि सी फ़ंक्शनक्या टाइमर की नींद की तुलना में बेहतर परिशुद्धता है()

sleep(60); 

दुर्लभ मौकों पर 60 सेकंड से कम समय तक सो जाएगा। या फ़ंक्शन ने थ्रेड को 60 से अधिक सोने का कारण बना दिया, लेकिन घड़ी ओएस द्वारा स्वचालित रूप से बदल दी गई थी (ऐसा लगता है क्योंकि बग केवल XX::00::00 पर हो रहा था), उर्फ ​​यह शायद ही कभी ही प्रकट हो रहा था, और केवल "राउंड घंटे" (नींद shoudl> xh0m0s पर समाप्त हो गया है, यह x-1h59m59.99*s पर समाप्त हुआ)।
फिर मेरा प्रोजेक्ट मैनेजर एक रान पर चला गया कि उसने लाखों बार कहा कि हमें केवल टाइमर का उपयोग करना चाहिए, सोना नहीं चाहिए। उस समय से मैंने इस धारणा को स्वीकार किया कि टाइमर नींद() से अधिक सटीक हैं, लेकिन अब मुझे लगता है कि मुझे कुछ और आधिकारिक स्रोत मांगना चाहिए। तो:

  1. टाइमर नींद से अधिक सटीक हैं?
  2. (संबंधित) क्या वे अलग-अलग तरीकों का उपयोग करके लागू किए गए हैं (ओएस स्तर पर)?
    मुझे पता है टाइमर का उपयोग कॉलबैक करने के लिए किया जाता है, नींद में वर्तमान धागे के निष्पादन में देरी होती है, मैं कार्यान्वयन के देरी निष्पादन हिस्से के बारे में बात करता हूं।

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

+0

किसी भी मामले में, टाइमर/नींद ऑपरेशन को दी गई अवधि के लिए वास्तव में रोकने की अपेक्षा करना एक अच्छा विचार नहीं है। ओएस आपके अनुरोध को सम्मानित करने के लिए कर सकता है, लेकिन कभी-कभी यह असफल हो जाएगा। इसके लिए तैयार रहें। – TheZ

+0

मुझे पता है कि अब, बग "फिक्स" (मैनेजर के बाद अपने टाइमर रेंट से शांत हो गया) कुछ सुरक्षा देरी जोड़ने के लिए था। – NoSenseEtAl

+11

ऐसा लगता है कि एक गहरी वास्तुशिल्प मुद्दा है यदि नींद में +/- 1 दूसरा अंतर सब कुछ तोड़ने का कारण बनता है ... – Rook

उत्तर

2

सरल कारण के लिए कोई सामान्य उत्तर नहीं है कि सी या सी ++ मानक में कुछ भी नहीं है जो आवेदन को सोने की क्षमता प्रदान करता है। तो चर्चा मूल रूप से ओएस-निर्भर होने जा रही है।

यूनिक्स sleep() फ़ंक्शन में एक मोटे ग्रॅन्युलरिटी है। usleep() और nanosleep() भी है जो बहुत अधिक बारीक ग्रॅन्युलरिटी है। फ़ंक्शन select() का उपयोग एप्लिकेशन को सोने के लिए भी किया जा सकता है। बस एक टाइमआउट निर्दिष्ट करें और कोई फ़ाइल वर्णनकर्ता नहीं।

नोट # 1: sleep(), usleep(), nanosleep(), itimers, और अलार्म के बीच बातचीत अनिर्दिष्ट है।

नोट # 2: इन तंत्रों में से किसी एक परमाणु घड़ी की सटीकता की अपेक्षा न करें।

3

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

एक टाइमर समय को और अधिक सटीक माप देगा। आम तौर पर एक टाइमर बोलने से सटीक समय माप जाएगा। दो प्रकार के टाइमर होते हैं - सिस्टम घड़ी पर आधारित "टाइम.h" में फ़ंक्शन की तरह। सिस्टम सिस्टम घड़ी में बदलाव जैसी चीजों से प्रभावित होंगे। उदाहरण के लिए - यदि आप सिस्टम का समय बदलते हैं, डेलाइट बचत समय से स्विच करते हैं, या मशीन को निलंबित करते हैं तो वास्तविक मापा समय वास्तविक समय से अलग हो सकता है।

अन्य प्रकार के घड़ियों उच्च रिज़ॉल्यूशन टाइमर हैं जो सीपीयू टिक पर आधारित हैं। ये विंडोज़ पर QueryPerformanceTimer जैसे टाइमर और linux पर clock_gettime() हैं। ये बस सीपीयू चक्रों की गणना करते हैं।वे सिस्टम घड़ी में परिवर्तन से प्रभावित नहीं होगा - लेकिन वे दो तरह से असली दुनिया समय से विचलित होगा:

  1. समय लंबी अवधि से अधिक परिवर्तित कर देगा क्योंकि घड़ी संकल्प ऐसी है कि लंबी अवधि के खत्म हो मापने सटीक नहीं है इस तरह से समय सीपीयू समय वास्तविक समय से बहाव करने का कारण बन जाएगा।
  2. यदि मशीन को सीपीयू स्टॉप निलंबित कर दिया गया है और टाइमर इस के लिए जिम्मेदार नहीं होगा।

आप जो करना चाहते हैं वह बहुत कम समय के लिए सो रहा है और उचित रिज़ॉल्यूशन वाली घड़ी का उपयोग करें। उदाहरण के लिए। यदि आपको कुछ मिनटों से कम समय तक सोना है, तो आपको उच्च रिज़ॉल्यूशन टाइमर का उपयोग करना चाहिए। नींद 100x अधिक बार आपको आवश्यकता होती है और हर बार सोने की नींद आती है यह देखने के लिए कि सही समय बीत चुका है या नहीं। यदि आपको कुछ मिनटों से अधिक समय तक सोने की ज़रूरत है, तो समय बीतने के लिए समय के साथ functons के साथ ऐसा करें।

यदि आपको समय के साथ 100% सटीक होने की आवश्यकता है तो आपको विशेष हार्डवेयर की आवश्यकता हो सकती है- या ऑनलाइन समय सर्वर के दौरान वास्तविक समय की जांच करने के लिए - नौसेना की परमाणु घड़ी की तरह। (http://tycho.usno.navy.mil/ntp.html)

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