2015-01-06 7 views
6

जब मैं निम्नलिखित कोड चलाने के लिए, मैं some output मिलती है:999μs बहुत छोटा कैसे है लेकिन 1000μs सही है?

use std::thread::Thread; 

static DELAY: i64 = 1000; 

fn main() { 
    Thread::spawn(move || { 
     println!("some output"); 
    }); 

    std::io::timer::sleep(std::time::duration::Duration::microseconds(DELAY)); 
} 

लेकिन अगर मैं 999 करने के लिए DELAY निर्धारित करते हैं, मैं कुछ भी नहीं मिलता है। मुझे लगता है कि 999 और 1000 इतने अंतर के कारण पर्याप्त नहीं हैं, जिसका मतलब है कि यहां कुछ और होना चाहिए। मैंने Duration::nanoseconds (999_999 और 1_000_000) के साथ भी कोशिश की है, और मैं वही व्यवहार देखता हूं।

मेरा प्लेटफ़ॉर्म लिनक्स है और मैं लगभग हर समय इस व्यवहार को पुन: उत्पन्न कर सकता हूं: 999 परिणामों का उपयोग some output में 1% से कम तरीके से किया जाता है।


एक साइडेनोट के रूप में, मुझे पता है कि यह दृष्टिकोण is wrong है।

+4

क्या आप इसे अलग-अलग वर्कलोड और सत्रों में विश्वसनीय बना सकते हैं? और आपका सटीक मंच क्या है? मुझे लगता है कि उत्तर किसी भी जंग कोड के बजाय आपके ऑपरेटिंग सिस्टम के शेड्यूलर में छिपा हुआ हो सकता है। – delnan

+0

मैंने प्रश्न संपादित किया है। – Tshepang

+1

"मैं इसे बहुत भरोसेमंद कर सकता हूं, लेकिन यह 100% समय नहीं होता है।" वह कितना भरोसेमंद है? – exussum

उत्तर

28

sleep फ़ंक्शन 1 मिलीसेकंड की वृद्धि में सोता है, और यदि मिलीसेकंड की संख्या 1 से कम है तो यह बिल्कुल सो नहीं जाती है। यहाँ प्रासंगिक excerpt from the code है:

pub fn sleep(&mut self, duration: Duration) { 
    // Short-circuit the timer backend for 0 duration 
    let ms = in_ms_u64(duration); 
    if ms == 0 { return } 
    self.inner.sleep(ms); 
} 

अपने कोड में, 999 माइक्रोसेकंड यह बिल्कुल सो नहीं बनाया है, और मुख्य थ्रेड समाप्त हो गया से पहले पैदा की धागा इसके उत्पादन प्रिंट कर सकता है। 1000 माइक्रोसॉन्ड के साथ, यानी 1 मिलीसेकंड, मुख्य धागा सो गया, जिससे स्पॉन्डेड थ्रेड को चलाने का मौका दिया गया।

-3

सबसे संभावित बात यह है कि आपके कर्नेल को 1000 हर्ट्ज की एक टिक (एक बार घड़ी प्रति मिलीसेकंड में बाधा डालने के लिए कॉन्फ़िगर किया गया है) शायद आप इसे एक बेहतर अनाज वाली घड़ी या एक बेकार कर्नेल पर पुन: संकलित कर सकते हैं और बेहतर कर्नेल को अनुमति देने के लिए अपने कर्नेल को पुनः संकलित कर सकते हैं संकल्प। 1000 हर्ट्ज घड़ी टिक आजकल लिनक्स कर्नेल में पीसी पर चल रही मानक है (और अधिकांश एआरएम और एम्बेडेड लिनक्स)।

यह एक नौसिखिया मुद्दा नहीं है, इसलिए शायद आपको अधिक समय संकल्प का सामना करने के लिए अपने कर्नेल को पुन: कॉन्फ़िगर करने और पुन: संकलित करने के लिए स्थानीय सहायता मांगनी होगी।

+0

को पहले से ही जवाब मिला है: http://stackoverflow.com/a/27804151/321731 – Tshepang

+0

जो डाउनवोट करने का कोई कारण नहीं है ... यदि यह है, तो थ्रेड बंद हो सकता है और अधिक टिप्पणियों की अनुमति नहीं देता है। मैं जवाब देने से पहले सभी स्टैक ओवरफ्लो पढ़ने के लिए कुछ मदद देने की कोशिश करता हूं। –

+0

जिस उत्तर का मैं जिक्र कर रहा हूं वह पहले से ही आपके द्वारा उत्तर दिए जा रहे प्रश्न पर स्वीकृत था। – Tshepang

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