Вызов thread.sleep () в ожидании появления нового потока - PullRequest
3 голосов
/ 16 июня 2011

Полагаю, этот вопрос можно свести к "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 ]

2 голосов
/ 16 июня 2011

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

1 голос
/ 16 июня 2011

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

0 голосов
/ 12 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...