October 24, 2006

Мой мир перевернулся

Самый активно используемый приём в мультитрединговом программировании объявлен вне закона. Источники близкие к Microsoft утверждают, что System.Threading.Thread.Sleep() это совершенно, то есть абсолютно, в корне неверное решение.

Я ещё нормально отнёсся к тому, что в .net 2.0 по сути запретили Suspend и Resume, я ими и не пользовался, но вот Sleep(). Это всё равно что запретить... воздух что ли. Нет, конечно, предлагаются альтернативные методы, которые несомненно будут работать, но как много связано с самим словом Sleep. Мне будет тебя не хватать, друг.

Навеяло рифму: "R.I.P. Sleep".

Technorati tags: , ,

Comments:
Я, честно говоря, и не знал что Sleep это "автивно используемый приём в мультитрединговом программировании". Сколько этим программированием занимаюсь использовал его только один раз, да и то, только в тестовом примере с демонстрацией бага.

 


Себе на заметку: "ставить смайлы везде и всегда, чтобы потом не было подобных коментариев"
А если серьёзно, имхо, есть места, где использвать слип ну очень удобно. А именно. Бешеные циклы, которые кушают 100% процессора в ожидании какого-нибудь условия, лечатся этим самым слипом просто и быстро.
Тут может возникнуть мысль, что не надо писать такие циклы. Но, к глубочайшему сожалению, не весь код пишем мы сами, что-то получается в наследство, и вопрос ставится следующим образом "либо переписать всё, либо вставить слип".
И вообще, обругать может каждый, а предложить решение обычно не сподабливается никто. Что предложите, господин NotAKernelGuy?
Варианты: Suspend&Resume -- они тоже в опале, Sleep-- отвергнут, Join -- не всегда уместен, WaitForXXX с таймаутом разве только, дык это тоже самое с точностью до деталей реализации.
Хотя, может я чего и не знаю.

 


> ставить смайлы везде и всегда, чтобы потом не было подобных коментариев

Всё равно не поможет. :-)

> Что предложите, господин NotAKernelGuy

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

 


Я всерьёз обеспокоен.
Про переделать дизайн это понятно. Но что использовать, когда надо остановить тред? И тут неважно сколькипроцессорная система. Треды всё равно иногда надо останавливать. Рискну предположить, что хорошим вариантом в этом случае будет не надежда на слип, а синхронизация через, например, WaitHandle? (Каюсь, но это единственное, что приходит в голову.)

 


> Но что использовать, когда надо остановить тред?
> Треды всё равно иногда надо останавливать.

Я бы сказал что от ответа на вопрос зачем нужно останавливать тред зависит ответ как это нужно делать. Хотя по идее вариантов не много: либо это объект синхронизации, либо - асинхронная операция.

> Рискну предположить, что хорошим вариантом в этом случае будет не надежда на слип, а синхронизация через, например, WaitHandle?

Sleep можно эмулировать ожидая с помощью WaitForXxx на non signalled event нужное количество времени. WaitHandle, насколько я понимаю, это обертка над WaitForXxx. Вполне можно ипльзовать. Опять же это в случае если нужно эмулировать Sleep. В иначе - редизайн таким образом, что Sleep будет не нужен.

 


Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?