Вызов thread.sleep() в ожидании появления нового потока

Я полагаю, что этот вопрос можно свести к "SpinWait vs. Block?", Но я подумал, что может быть более интересный ответ, почему почти каждый учебник по C# продвижению предлагает следующий вызов:

Thread newThread = new Thread(new ThreadStart(ThreadMethod));
newThread.Start()
while (!newThread.isAlive()) ;
Thread.Sleep(1); // Allow the new thread to do some work

В отличие от блокировок вот так:

Thread newThread = new Thread(new ThreadStart(ThreadMethod));
newThread.Start()
while (!newThread.isAlive()) Thread.Sleep(1);
Thread.Sleep(1); // Allow the new thread to do some work

Мое очень грубое тестирование (окружение цикла while вызовами DateTime.Ticks) на самом деле ничего не показывает (говорит, что в обоих случаях разница составляет 0 тиков).

Является ли процесс создания потока достаточно коротким, чтобы вращение было более эффективным? Или в большинстве уроков предлагается вращение, потому что оно немного элегантнее, а разница во времени незначительна?

3 ответа

Я не знаю, почему вы использовали бы это - в верхней части моей головы, я не могу придумать ни одного варианта использования для блокировки вызывающего потока, пока новый поток не станет живым, поскольку "Alive" не означает, что он выполнил что-нибудь. Если вам нужно дождаться запуска некоторого кода в новом потоке, прежде чем переходить к вызывающему потоку, вам следует использовать WaitHandle или SpinLock.

Вы можете сделать поток установленным событием, когда он запускается, и основным потоком, чтобы ждать события. нет спинвейта, не слишком долго спит.

В этой статье объясняется использование SpinWait, а также упоминаются различные типы сна http://www.emadomara.com/2011/08/spinwait-and-lock-free-code.html

Другие вопросы по тегам