Sleep (1) является документированным способом в Windows, чтобы получить процессор и разрешить запуск других потоков. Вы можете найти этот код в справочном Источник с комментариями:
// 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. У автора были некоторые проблемы с английским «нарушение чтения» - это «неустойчивое чтение». Основная идея заключается в том, чтобы попытаться избежать уступки, переключатели контекста потока очень дороги, и некоторые надеются, что писатель быстро справится. Если это не отключается, то явно дается возможность избежать сжигания процессора. Сегодня это, вероятно, было написано Spinlock, но Hashtable очень старый. Как и предположения о модели памяти.
Похож на спинвитер перед переключением контекста. То есть он проверяет состояние 8 раз, прежде чем положить поток в режим сна. – Groo
[Аналогичная тема] (http://stackoverflow.com/questions/508208/what-is-the-impact-of-thread-sleep1-in-c); Crux должен позволить ОС планировать другую задачу – Konstantin