В чем назначение нити.Способ SpinWait?


с MSDN не совсем понятно его назначение.

может ли он использоваться для имитации интенсивного теста расчета процессора?

4 60

4 ответа:

нет. Его используют в качестве замены для очень кратковременных вызовов сна.

при многопоточной блокировке, если ресурс, который вы пытаетесь получить, уже заблокирован, Вы обычно переходите в спящий режим и ждете, пока он станет свободным. Когда вы делаете это, вы отказываетесь от остальной части времени, которое вам было выделено планировщиком, чтобы использовать процессор, чтобы кто-то другой мог пойти. Обычно это нормально, особенно для длительных ожиданий, таких как ожидание ввода-вывода, может выполняться множество других процессов на процессоре, пока вы ждете вращения шпинделя диска.

однако, иногда, вы ждете в течение небольшого количества времени. В этих случаях вы обычно отказываетесь от своего оставшегося времени в любом случае и ждете, пока все остальные потоки сделают свое дело, прежде чем получить еще один ход.. таким образом, вы можете обмануть, вместо того, чтобы ждать, вы сидите там постоянно опрашивая в " мы уже почти там?' путь. Если замок удерживается только в течение части оставшегося времени, это становится очень эффективным средства ожидания, его также очень эффективны, поскольку планировщик не должен участвовать в перестановке всех других потоков, чтобы использовать время, которое вы отказываетесь, если вы ждали нормально.

очевидно, что если вы вращаетесь каждый раз, когда вы хотите заблокировать, вы не будете очень популярны, ваше приложение станет вялым и будет использовать 100% процессор, но в очень малых дозах, в нужное время, это делает приложение более отзывчивым.

Если вы сейчас думаете 'когда я должен использовать его?- это сложный вызов make-если у вас есть ресурс, который очень часто блокируется и разблокируется очень быстро, то спин-замок вокруг этого вместо ожидания-хорошая идея (а затем проверить ваше приложение на производительность), если вы попытаетесь вращаться в течение короткого времени, а затем вернуться к нормальному ожиданию, это тоже разумный способ. Но, как правило, вам никогда не нужно будет использовать его.

цель состоит в том, чтобы сделать "дешевое" ожидание, если вы считаете, что условие, которого вы ждете, сбудется очень, очень скоро. Обычно, если вы чего-то ждете, вы позволяете потоку спать, и процессор/ОС переключится на другой поток. Контекстные переключатели не особенно дешевы, поэтому, если у вас есть расширенные знания о ситуации и вы считаете, что ждать дешевле, чем переключать контекст, вы ждете.

мой совет: если вам нужно спросить, вы не нужно его использовать. (Я сам никогда этого не хотел.) В основном это одна из тех вещей, которая действительно полезна в очень немногих ситуациях, но большинство людей должны оставить в покое.

Как Примечание стороны, компания Microsoft избавилась от механизма потока диспетчера блокировки из Windows 7, так как она не очень хорошо масштабируется на многоядерных процессоров. Взгляните на этой:

Что касается меня (и я рад за исправления!), единственное использование Spin waits - это реализация механизма блокировки или обратного вызова между потоками. И ни то, ни другое не следует делать вручную (обычно), поскольку они уже существуют.

когда вы заблокировали ресурс и другой поток запрашивает синхронизированный доступ к нему, он в основном должен ждать, пока первый поток закончит его использовать. Это ожидание можно сделать, просто вращаясь в цикле (или иначе спать + контекст переключение, как упоминалось Джоном).