yigal_s: (Default)
[personal profile] yigal_s
Внезапно оказалось, что я не вполне понимаю спецификацию автоматического Event в Windows.

Вот что в ней написано:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682655(v=vs.85).aspx

Auto-reset event

An event object whose state remains signaled until a single waiting thread is released, at which time the system automatically sets the state to nonsignaled.
If no threads are waiting, the event object's state remains signaled. If more than one thread is waiting, a waiting thread is selected. Do not assume a first-in, first-out (FIFO) order. External events such as kernel-mode APCs can change the wait order.

Из этого описания мне несколько непонятно, можно ли просигналить Event, а ЗАТЕМ тем же тредом дождаться этого Event-a, если одновременно в наличии другие треды, уже ждущие данный Event?

Если же кто-то процитирует "a waiting thread is selected" как свидетельство того, что выбирается всё же один из уже ждущих тредов, я спрошу иначе:

если есть несколько ждущих тредов и два треда одновременно вызывают SetEvent, есть ли гарантия, что разблокируются два ждущих треда, или такой гарантии всё же нет и один из SetEvent может потеряться?

Date: 2012-12-18 02:01 am (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Из описания мне видится, что если ждущих тредов нет, два треда вызывают SetEvent, и лишь затем два каких-нибудь треда пытаются этого события дождаться, то разблокируется лишь один. Поэтому я бы на гарантию, упомянутую в посте, не рассчитывал.

Date: 2012-12-18 02:37 am (UTC)
From: [identity profile] yatur.livejournal.com
> у нас нет детерминистического способа обеспечить, чтобы ждущие треды действительно УЖЕ ждали

Он разблокирует ровно один поток при переходе signaled->not signaled.
Пока ждущих потоков нет, он будет висеть в состоянии signaled.

Date: 2012-12-18 02:54 am (UTC)
From: [identity profile] yatur.livejournal.com
Windows is unfair :)

Что касается busy-wait mutex'а, то потоки должны быть в процессе класса real-time. Иначе их приоритеты скачут случайным образом. И их должно быть много. В общем, это надо специально тестовый пример писать. И я подозреваю, что starvation таки можно устроить, если иметь исходные коды скедулера. Только кто ж нам их даст :D

Date: 2012-12-18 02:50 am (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Я не совсем понял претензию к науке. Здесь же у нас какая-то конкретная - видимо, дешевая - реализация, предназначенная для конкретных действий, которые иммунны к подобному поведению объекта.

Date: 2012-12-18 03:06 am (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Я тоже не смогу. В худшем случае, если, скажем, в планировщике есть какой-нибудь простой датчик случайных чисел с модулем по небольшому простому числу, и количество готовых к выполнению тредов будет постоянно совпадать с этим числом, то, наверное, теоретически может что-то не очень хорошее случиться.

А такая реализация Event, с возможной потерей дополнительных сигналов и непредсказуемой очередностью, на мой взгляд, означает, что все потребители сигналов предполагаются эквивалентными (и вдобавок идемпотентными), и ситуация "сама садик я садила, сама буду поливать" приемлема.

Date: 2012-12-18 03:38 am (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Пожалуй, да. И в науке хорошо было бы, чтобы приводился пример с асимптотически честного, но зловредного планировщика, доказывающий необходимость борьбы с ним с помощью дополнительного усложнения кода.

Date: 2012-12-18 02:35 am (UTC)
From: [identity profile] yatur.livejournal.com
Коротко: да, может потеряться.

Подробнее: Auto-Reset Event, уходя в состояние not signaled, разблокирует ровно один ждущий поток. Это может быть и тот самый поток, который вызвал SetEvent(), если он вдруг потом сказал WaitForSingleObject().

Date: 2012-12-18 02:52 am (UTC)
From: [identity profile] yatur.livejournal.com
Исследовать поведение scheduler'а из-под самого scheduler'а вообще довольно трудно. Постоянно оказываешься в положении кота Шредингера - неизвестно, жив ты или мертв, а также неизвестно когда и кто откроет ящик.