2010-06-18 13 views
20

मुझे हाल ही में सटीक अवधि के लिए वर्तमान धागे को सोने की आवश्यकता में आया। मुझे पॉज़िक्स प्लेटफ़ॉर्म पर ऐसा करने के दो तरीकों के बारे में पता है: nanosleep() का उपयोग करके या boost::this_thread::sleep() का उपयोग करना।बढ़ावा :: this_thread :: नींद() बनाम नैनोस्लीप()?

किसी अन्य चीज़ से जिज्ञासा से बाहर, मैं सोच रहा था कि दोनों दृष्टिकोणों के बीच मतभेद क्या हैं। क्या परिशुद्धता में कोई अंतर है, और बूस्ट दृष्टिकोण का उपयोग करने के लिए कोई कारण नहीं है?

nanosleep() दृष्टिकोण:

#include <time.h> 
... 
struct timespec sleepTime; 
struct timespec returnTime; 
sleepTime.tv_sec = 0; 
sleepTime.tv_nsec = 1000; 
nanosleep(&sleepTime, &returnTime); 

बूस्ट दृष्टिकोण:

#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/thread/thread.hpp> 
... 
boost::this_thread::sleep(boost::posix_time::nanoseconds(1000)); 
+3

उदाहरण के लिए बस एक छोटा सा नोट: सभी सिस्टम पर 'नैनोसेकंड्स' उपलब्ध नहीं है। 'माइक्रोसॉन्ड' का उपयोग करना अधिक सुरक्षित होगा। – real4x

उत्तर

26

कुछ कारणों की वजह उपयोग को बढ़ावा देने कि मैं के बारे में सोच सकते हैं:

  • boost::this_thread::sleep() boost.thread में एक रुकावट बिंदु
  • boost::this_thread::sleep() हो सकता है ड्रॉप-में C++ 0x के std::this_thread::sleep_until() द्वारा बदल दिया भविष्य में

क्यों नहीं - यदि आप धागे का उपयोग नहीं कर रहे हैं, या आप में बाकी सब कुछ नहीं आर प्रोजेक्ट POSIX कॉल का उपयोग करता है, फिर nanosleep() अधिक समझ में आता है।

परिशुद्धता के लिए, मेरे सिस्टम पर दोनों बूस्ट और नैनोस्ली() एक ही सिस्टम कॉल, hrtimer_nanosleep() पर कॉल करते हैं। मुझे लगता है कि बूस्ट लेखक प्रत्येक सिस्टम पर उच्चतम सटीकता प्राप्त करने का प्रयास करते हैं और मेरे लिए यह वही होता है जो nanosleep() प्रदान करता है।

+6

+1 - यह ध्यान दिया जाना चाहिए कि थ्रेड नींद के आधार पर समय - यहां तक ​​कि नैनोस्लीप - अविश्वसनीय रूप से अविश्वसनीय है। –

+0

'this_thread :: sleep()' का उपयोग करने का एक कारण यह है कि आपको जो भी इकाइयां पसंद हैं, इसमें समय लगता है: 'नींद (सेकंड (10)) ',' नींद (नैनोसेकंड (10)) ',' नींद (एटोजकंड्स (10))) '। हार्डवेयर रिज़ॉल्यूशन नहीं बदलता है, लेकिन जो भी रिज़ॉल्यूशन पेश किया जाता है, उसे नई नींद एपीआई ('नींद ',' नींद ',' नैनोस्ली 'इत्यादि) रखने की आवश्यकता के बिना उजागर किया जा सकता है। – bames53

4

तो ऐसा कोई कारण बूस्ट दृष्टिकोण

मुझे लगता है यह स्पष्ट तरह का है उपयोग करने के लिए नहीं है, लेकिन एकमात्र कारण मैं सोच सकता हूं कि आपको बूस्ट टी की आवश्यकता होगी ओ अपनी परियोजना संकलित करें।

+0

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

5

कैसा उदाहरण है क्योंकि आपका नैनोस्लीप उदाहरण गलत है।

#include <time.h> 
... 
struct timespec sleepTime; 
struct timespec time_left_to_sleep; 
sleepTime.tv_sec = 0; 
sleepTime.tv_nsec = 1000; 
while((sleepTime.tv_sec + sleepTime.tv_nsec) > 0) 
{ 
    nanosleep(&sleepTime, &time_left_to_sleep); 
    sleepTime.tv_sec = time_left_to_sleep.tv_sec; 
    sleepTime.tv_nsec = time_left_to_sleep.tv_nsec; 
} 

वैसे अगर आप केवल 1 माइक्रोसेकंड जागने बहुत जल्दी एक मुद्दा नहीं होना चाहिए के लिए सो रहे हैं, लेकिन सामान्य स्थिति में यह केवल यह कर पाने के लिए रास्ता है।

और बूस्ट के पक्ष में केक को बर्फ देने के लिए, boost::this_thread::sleep()nanosleep() का उपयोग करके लागू किया गया है। उन्होंने सिर्फ आपके लिए सभी पागल कोने के मामलों का ख्याल रखा।

+0

+1, मुझे लगा कि बूथ 'नींद() 'को' नैनोस्लीप() 'के साथ लागू किया जाएगा, पुष्टि करने के लिए अच्छा है। –

+0

आप नींद नींद के साथ लागू नींद कहां देखते हैं? Thread.hpp में मैं देख रहा हूं: इनलाइन शून्य नींद (xtime const और abs_time) {नींद (system_time (abs_time)); } – clemahieu

+0

@clemahieu: यह ':: नींद 'नहीं है (अन्यथा आप सेकंड रिज़ॉल्यूशन तक ही सीमित रहेंगे)। यह कई अन्य 'boost :: this_thread :: sleep' ओवरलोड में से एक के लिए एक कॉल है, जिसका परिभाषा आपको' libs/thread/src/pthread/thread.cpp' में मिल सकती है। –

2

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

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