İşlemciyi vermek ve diğer iş parçacıklarının çalışmasına izin vermek için uyku (1) Windows'ta belgelenmiş bir yöntemdir. Yorumlarla Referans Kaynak Bu kodu bulabilirsiniz:
// 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 değişken uçucu bir bool. Yazarın İngilizcede "ihmal okuma" ile ilgili bir sorun vardı "uçucu okundu". Temel fikir verimden kaçınmaya çalışmaktır, konu bağlam anahtarları çok pahalıdır ve yazarın çabucak bitirilmesi umudunu taşımaktadır. Bu tava dışarı çıkmazsa, cpu'nun yanmasını önlemek için açık bir şekilde verim verir. Bu muhtemelen bugün Spinlock ile yazılmıştır, ancak Hashtable çok eskidir. Bellek modeli ile ilgili varsayımlar gibi.
Bir içerik anahtarından önce bir spinwait gibi görünüyor. Yani İpliği uyumadan önce 8 kez bir koşulu kontrol eder. – Groo
[Benzer konu] (http://stackoverflow.com/questions/508208/what-is-the-impact-of-thread-sleep1-in-c); Crux, OS'nin başka bir görevi zamanlamasına izin vermektir – Konstantin