/ / Ако извикате EventWaitHandle.Set () X пъти, ще сигнал ли X нишки, ако X нишките още не са започнали? - c #, multithreading

Ако извикате EventWaitHandle.Set () X пъти, ще сигнал ли X нишки, ако X нишките все още не са започнали? - c #, multithreading

С други думи имам нишка, която започва и се обажда waitHandle.Set() много пъти. След това започвам няколко теми и всеки от тях чака WaitHandle, Ще X от тях да бъдат сигнализирани, където X е броят пъти, по които е била наречена оригиналната нишка waitHandle.Set()?

Има ли структура, която подкрепя онова, което се опитвам да постигна по-отблизо?

Отговори:

9 за отговор № 1

Може би, но вероятно не.

Събитие може да бъде зададено или изключено, ако има такаванищо, което да деактивира събитието, след това повтарящите се обаждания до Set няма да променят състоянието му, освен ако не е събитие за автоматично нулиране и има поне една нишка в него. При събитие с ръчно нулиране всички нишки, които чакат (или започват да чакат), ще бъдат освободени, докато нещо не изведе събитието.

Мисля, че всъщност ще искате семафор, който има брой и поддържа настройка п пъти за освобождаване п (дори ако някои от тези нишки започват само да чакат някои от обажданията да се задават).


3 за отговор № 2

Това зависи от EventResetMode, Ако е настроено на EventResetMode.AutoReset тя ще пусне само една нишка. Ако това е "EventResetMode.ManualReset" обаче той ще освободи всички блокирани нишки за събитието.

Semaphore.Release(Int)

Където Ин е броят ще бъде един начин да направите това.


1 за отговор № 3

Както каза Ричард, EventWaitHandles има само един флаг и не може да преброи броя пъти, които Set е бил повикан. Опростеното решение за добавяне на променлива на броя води до състояние на състезание.

Уилям Кемпф има статия за това защо не броим променливите и решение, използващо класа .Net Monitor.