नींद (1) प्रोसेसर उत्पन्न करने और अन्य थ्रेड चलाने की अनुमति देने के लिए विंडोज़ में एक दस्तावेज तरीका है। आप टिप्पणी के साथ संदर्भ स्रोत में इस कोड को पा सकते हैं:
// Our memory model guarantee if we pick up the change in bucket from another processor,
// we will see the 'isWriterProgress' flag to be true or 'version' is changed in the reader.
//
int spinCount = 0;
do {
// this is violate read, following memory accesses can not be moved ahead of it.
currentversion = version;
b = lbuckets[bucketNumber];
// The contention between reader and writer shouldn't happen frequently.
// But just in case this will burn CPU, yield the control of CPU if we spinned a few times.
// 8 is just a random number I pick.
if((++spinCount) % 8 == 0) {
Thread.Sleep(1); // 1 means we are yeilding control to all threads, including low-priority ones.
}
} while (isWriterInProgress || (currentversion != version));
isWriterInProgress चर एक अस्थिर bool है। लेखक को "उल्लंघन पढ़ने" के साथ कुछ परेशानी थी "अस्थिर पढ़ने" है। बुनियादी विचार उपज से बचने का प्रयास है, थ्रेड संदर्भ स्विच बहुत महंगा हैं, कुछ उम्मीद है कि लेखक जल्दी से किया जाता है। यदि वह बाहर नहीं निकलता है तो स्पष्ट रूप से जलती हुई सीपीयू से बचने के लिए उपज होती है। यह शायद आज स्पिनलॉक के साथ लिखा गया है लेकिन हैशटेबल बहुत पुराना है। मेमोरी मॉडल के बारे में धारणाएं हैं।
स्रोत
2013-11-15 17:29:58
एक संदर्भ स्विच से पहले एक स्पिनवाइट की तरह दिखता है। अर्थात। यह थ्रेड को सोने से पहले 8 बार एक शर्त के लिए जांचता है। – Groo
[इसी तरह के थ्रेड] (http://stackoverflow.com/questions/508208/what-is-the-impact-of-thread-sleep1-in-c); क्रूक्स ओएस को अन्य कार्य निर्धारित करने की अनुमति देना है – Konstantin