объяснение темы. Предположение о доходности - PullRequest
2 голосов
/ 06 августа 2011

Может кто-нибудь объяснить мне это:

если вставить Thread.Yield () в любом месте вашего кода, создающего или разрушающем программу, вы почти наверняка имеете ошибку.

Я читал здесь: http://www.albahari.com/threading/

Ответы [ 2 ]

5 голосов
/ 07 августа 2011

Я могу только догадываться о намерениях автора, но: планирование потоков уже не определено.Если добавление доходности заставляет его работать, то я предполагаю, что реальность здесь заключается в том, что он полагается на побочный эффект состояния гонки, то есть передача некоторого ЦП другому потоку позволяет синхронизировать время таким образом, чтобы происходило правильное.Ну, вы не знаете, что вы уступаете в параллельной системе, а в системе milticore вы, вероятно, не будете уступать тому же самому (выход - только один и тот же процессор).Таким образом, единственный разумный способ сделать это - использовать такую ​​структуру, как Monitor, Mutex, Semaphore, ResetEvent или какой-либо другой блокирующий примитив, предназначенный для обеспечения контролируемого потока между потоками и (иногда) процессами.

2 голосов
/ 07 августа 2011

Мое предположение, которое я обсуждал здесь , заключается в том, что Thread.Yield создает неявный барьер памяти.Если у вас есть проблема с памятью, она может исчезнуть, добавив вызов к Thread.Yield.Это похоже на то, как использование Thread.Sleep для имитации чередования потоков может привести к маскировке проблемы.Кроме того, Thread.Yield, очевидно, изменит время, когда выполняются инструкции, и это может повлиять на то, соблюдается ли условие гонки или нет.

...