- 1
- 2
while(!ThreadActivateFlag)
Sleep(0);
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+162
while(!ThreadActivateFlag)
Sleep(0);
komprenda 16.12.2010 11:18 # −11
brainstorm 16.12.2010 14:26 # +4
bugmenot 16.12.2010 20:13 # +5
istem 16.12.2010 20:50 # +3
inkanus-gray 16.12.2010 21:45 # 0
Срочно выручайте! Если не успеем, он свернёт горизонт и захавает мир!
istem 16.12.2010 22:51 # +3
TarasB 17.12.2010 11:18 # +5
TarasB 16.12.2010 11:18 # +2
Анонимус 16.12.2010 22:01 # +3
guest 16.12.2010 20:07 # 0
KoderZ 17.12.2010 11:50 # +1
sanchousf 17.12.2010 17:37 # +2
Ч. Петзолд "Программирование для Windows® 95 в двух томах" Том 2 стр. 41
Так что Sleep(0) там нормально стоит, но светофор однозначно глючить будет.
bugmenot 17.12.2010 18:07 # 0
TheCalligrapher 18.12.2010 03:13 # 0
Для "мелкодисперсной" синзхронизации с коротким временеим ожидания - именно spin-lock, как показано выше, и ни в коем случае не "ждать объекта".
"Ждать объекта" - это только для грубой синхронизации с длительными спячками. "Объектами" синхорнизируют GUI, IO и т.п. тяжеловесные вещи.
Вычисления же синхронизируются имено во таким spin-lock-ами. Это если вам нужна эффективность, конечно.
guest 18.12.2010 15:42 # 0
http://www.govnokod.ru/4937#comment58422
TheCalligrapher 20.12.2010 08:50 # 0
guest 20.12.2010 23:12 # 0
guest 16.12.2010 22:49 # 0
И недоучка - программист.
Altravert 17.12.2010 09:44 # +6
Говногость 17.12.2010 22:54 # 0
TheCalligrapher 18.12.2010 03:08 # 0
Приведенный код - простейшая классическая реализация spin-lock. Фукция `Sleep` с параметром `0` в WinAPI имеет особый смысл и особое назначение. `Spin(0)` означает "передать остаток временного слайса следующему готовому к выполнению потоку". Т.е. это сделано именно для того, чтобы не грузить процессор бессмысленным мотанием по пустому циклу, а вместо этого передать ненужный остаток временного слайса дальше, на полезную работу. Т.е. никакого потока-эгоиста тут нет. Все в точности наоборот: налицо корректно и умышленно примененый прием, делающий поток НЕ эгоистом.
Spin-lock - исключительно полезный синхронизационный примитив. Придираться в данном случае можно было бы к оформлению: вместо выделенного примитива, реализация spin-lock протя вписана явно в код - это криво. Отдельно стоило бы рассмотреть традиционный вопрос применения spin lock вместо системного sleep-lock, но об этом без контекста говорить не приходится.
TheCalligrapher 18.12.2010 03:15 # 0
guest 18.12.2010 15:32 # −3
TheCalligrapher 20.12.2010 08:50 # +2
TarasB 20.12.2010 10:32 # 0
guest 20.12.2010 16:28 # +1
guest 18.12.2010 15:33 # 0
TheCalligrapher 20.12.2010 08:49 # −1
guest 20.12.2010 16:26 # 0
Все объяснил ниже в http://www.govnokod.ru/4937#comment58917
guest 18.12.2010 15:40 # +1
TheCalligrapher 20.12.2010 08:56 # −2
Отдельно стоит заметить, что, например, виндушный CRITICAL_SECTION - это внутеренне ни что иное, как гибрид spin-lock (вот именно такого, как приведено выше) и "ожидания события" (там семафор внутри, на самом деле). Сначала делается ожилание по spin-lock, и только потом, если дождаться не удалось, делается постановка на "ожидание события". Именно из-за грамотного использования spin-lock можно достичь существенно лучшей производительности CRITICAL_SECTION по сравнению с mutex.
xXx_totalwar 20.12.2010 11:57 # +1
>CRITICAL_SECTION
>mutex
ребятки, не хотел вас расстраивать, но 70е кончились.
guest 20.12.2010 16:15 # +1
xXx_totalwar 20.12.2010 16:35 # 0
для асинхронности без заморочек само собой CPS и корутины - stackless python, twisted, go..
guest 20.12.2010 16:44 # 0
xXx_totalwar 20.12.2010 16:50 # 0
guest 20.12.2010 19:26 # 0
guest 20.12.2010 19:27 # 0
xXx_totalwar 20.12.2010 19:28 # 0
bugmenot 20.12.2010 19:40 # +1
TheCalligrapher 20.12.2010 20:39 # +1
А в реальной жизни у нас есть то, что в советском вузе называлось "семантическим разрывом между архитектурой ЭВМ и абстрактными языками программирования". И все эти эрланги-шмерланги в конечном итоге посторены вот на таких же спин-локах (больше попросту не на чем строить). А STM - это хорошо... Вот бы если бы оно еще в реальности приемлемо работало... (все из-за того же семантического разрыва).
Пока в машинных архитектурах царят 70-е, эти 70-е в программировании не закончатся. А всякие эрланги-шмерланги по этой причине годны только для написания разных "хелловорлдов" и т.п...
xXx_totalwar 20.12.2010 20:42 # 0
хотя к императиво..м нужно как к детишкам, измазавшимся говн... нет, просто промолчу.
guest 20.12.2010 16:19 # +3
Нет никакого sleep. Смысл спинлока в том, что-бы не отдавать управление другому потоку на многоядерных системах, тк это медленно. А Sleep как раз отдаёт управление другому потоку. В данном случае цикл быть спинлоком не может, раз отдаёт управление другому потоку.
guest 23.12.2010 09:09 # +2
http://ru.wikipedia.org/wiki/Spinlock
, тк отдаёт управление другому потоку в каждой итерации.
Более того, этот код работает медленее и пожирает значительно больше процессорного времени, чем код на событиях или код на спинлоках+событиях.
Спинлок обычно применяется именно совместно с событиями. Притом спинлок применяется только на многопроцессорных машинах. Сначало пытаемся ждать по спинлоку, но если не дождались за короткий период времени, то уже возвращаем управление другим потокам, что-бы зря не занимать процессор.
guest 02.01.2011 01:52 # 0
bmx666 18.01.2011 17:18 # −1
Если да, то гавнокод :)
Если есть другие потоки, которые манипулируют с этой переменной, то такое возможно при работе с аппаратурой. К примеру: прослушка порта и получение данных с датчиков, счетчиков и т.д. в очень короткие интервалы времени и на загрузку процессора вообще насрать, если хоть один бит мимо пройдет.