Sleep(1) est documenté de manière à Windows de rendement du processeur et de permettre à d'autres threads de s'exécuter. Vous pouvez trouver ce code dans la Source de Référence avec les commentaires:
// 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) );
Le isWriterInProgress variable est un volatile bool. L'auteur a eu quelques difficultés avec l'anglais "violer lire" est "volatile lire". L'idée de base est d'essayer de ne pas céder, au fil des changements de contexte sont très cher, avec un peu d'espoir que l'auteur se fait rapidement. Si cela ne fonctionne pas dehors alors explicitement de rendement pour éviter de brûler de l'uc. Cela aurait probablement été écrit avec Spinlock aujourd'hui, mais à la table de hachage est très ancienne. Que sont les hypothèses sur le modèle de mémoire.