October 24, 2006
Мой мир перевернулся
Самый активно используемый приём в мультитрединговом программировании объявлен вне закона. Источники близкие к Microsoft утверждают, что System.Threading.Thread.Sleep() это совершенно, то есть абсолютно, в корне неверное решение.
Я ещё нормально отнёсся к тому, что в .net 2.0 по сути запретили Suspend и Resume, я ими и не пользовался, но вот Sleep(). Это всё равно что запретить... воздух что ли. Нет, конечно, предлагаются альтернативные методы, которые несомненно будут работать, но как много связано с самим словом Sleep. Мне будет тебя не хватать, друг.
Навеяло рифму: "R.I.P. Sleep".
Comments:
Post a Comment
<< Home
Я, честно говоря, и не знал что Sleep это "автивно используемый приём в мультитрединговом программировании". Сколько этим программированием занимаюсь использовал его только один раз, да и то, только в тестовом примере с демонстрацией бага.
Себе на заметку: "ставить смайлы везде и всегда, чтобы потом не было подобных коментариев"
А если серьёзно, имхо, есть места, где использвать слип ну очень удобно. А именно. Бешеные циклы, которые кушают 100% процессора в ожидании какого-нибудь условия, лечатся этим самым слипом просто и быстро.
Тут может возникнуть мысль, что не надо писать такие циклы. Но, к глубочайшему сожалению, не весь код пишем мы сами, что-то получается в наследство, и вопрос ставится следующим образом "либо переписать всё, либо вставить слип".
И вообще, обругать может каждый, а предложить решение обычно не сподабливается никто. Что предложите, господин NotAKernelGuy?
Варианты: Suspend&Resume -- они тоже в опале, Sleep-- отвергнут, Join -- не всегда уместен, WaitForXXX с таймаутом разве только, дык это тоже самое с точностью до деталей реализации.
Хотя, может я чего и не знаю.
А если серьёзно, имхо, есть места, где использвать слип ну очень удобно. А именно. Бешеные циклы, которые кушают 100% процессора в ожидании какого-нибудь условия, лечатся этим самым слипом просто и быстро.
Тут может возникнуть мысль, что не надо писать такие циклы. Но, к глубочайшему сожалению, не весь код пишем мы сами, что-то получается в наследство, и вопрос ставится следующим образом "либо переписать всё, либо вставить слип".
И вообще, обругать может каждый, а предложить решение обычно не сподабливается никто. Что предложите, господин NotAKernelGuy?
Варианты: Suspend&Resume -- они тоже в опале, Sleep-- отвергнут, Join -- не всегда уместен, WaitForXXX с таймаутом разве только, дык это тоже самое с точностью до деталей реализации.
Хотя, может я чего и не знаю.
> ставить смайлы везде и всегда, чтобы потом не было подобных коментариев
Всё равно не поможет. :-)
> Что предложите, господин NotAKernelGuy
Предложу банальность - переделать дизайн. В случае доставшегося в наследство кода, тогать который нет никакого желания, - эмуляция Sleep на WaitForXxx вполне себе костыль. Помимо всего прочего это ещё и напоминие "а дизайн все-таки нужно переделать". В свете наступаших многоядерных процессоров - вполне логичное решение.
Всё равно не поможет. :-)
> Что предложите, господин NotAKernelGuy
Предложу банальность - переделать дизайн. В случае доставшегося в наследство кода, тогать который нет никакого желания, - эмуляция Sleep на WaitForXxx вполне себе костыль. Помимо всего прочего это ещё и напоминие "а дизайн все-таки нужно переделать". В свете наступаших многоядерных процессоров - вполне логичное решение.
Я всерьёз обеспокоен.
Про переделать дизайн это понятно. Но что использовать, когда надо остановить тред? И тут неважно сколькипроцессорная система. Треды всё равно иногда надо останавливать. Рискну предположить, что хорошим вариантом в этом случае будет не надежда на слип, а синхронизация через, например, WaitHandle? (Каюсь, но это единственное, что приходит в голову.)
Про переделать дизайн это понятно. Но что использовать, когда надо остановить тред? И тут неважно сколькипроцессорная система. Треды всё равно иногда надо останавливать. Рискну предположить, что хорошим вариантом в этом случае будет не надежда на слип, а синхронизация через, например, WaitHandle? (Каюсь, но это единственное, что приходит в голову.)
> Но что использовать, когда надо остановить тред?
> Треды всё равно иногда надо останавливать.
Я бы сказал что от ответа на вопрос зачем нужно останавливать тред зависит ответ как это нужно делать. Хотя по идее вариантов не много: либо это объект синхронизации, либо - асинхронная операция.
> Рискну предположить, что хорошим вариантом в этом случае будет не надежда на слип, а синхронизация через, например, WaitHandle?
Sleep можно эмулировать ожидая с помощью WaitForXxx на non signalled event нужное количество времени. WaitHandle, насколько я понимаю, это обертка над WaitForXxx. Вполне можно ипльзовать. Опять же это в случае если нужно эмулировать Sleep. В иначе - редизайн таким образом, что Sleep будет не нужен.
> Треды всё равно иногда надо останавливать.
Я бы сказал что от ответа на вопрос зачем нужно останавливать тред зависит ответ как это нужно делать. Хотя по идее вариантов не много: либо это объект синхронизации, либо - асинхронная операция.
> Рискну предположить, что хорошим вариантом в этом случае будет не надежда на слип, а синхронизация через, например, WaitHandle?
Sleep можно эмулировать ожидая с помощью WaitForXxx на non signalled event нужное количество времени. WaitHandle, насколько я понимаю, это обертка над WaitForXxx. Вполне можно ипльзовать. Опять же это в случае если нужно эмулировать Sleep. В иначе - редизайн таким образом, что Sleep будет не нужен.
Post a Comment
<< Home