/ / Se você chamar EventWaitHandle.Set () X vezes, ele indicará os threads X se X os threads ainda não tiverem iniciado? - c #, multithreading

Se você chamar EventWaitHandle.Set () X vezes, ele indicará X threads se X os threads ainda não tiverem iniciado? - c #, multithreading

Em outras palavras, eu tenho um thread que inicia e chama waitHandle.Set() várias vezes. Então eu começo vários tópicos e cada um está esperando WaitHandle. Será que X deles será sinalizado onde X é o número de vezes que o segmento original é chamado waitHandle.Set()?

Existe uma estrutura que suporta o que eu estou tentando realizar mais de perto?

Respostas:

9 para resposta № 1

Talvez, mas provavelmente não.

Um evento só pode ser definido ou cancelado, se houvernada para cancelar o evento, em seguida, as chamadas repetidas para Set não alterarão seu estado, a menos que seja um evento de redefinição automática e haja pelo menos um thread aguardando. Com um evento de redefinição manual, qualquer encadeamento aguardando (ou começando a aguardar) será liberado até que algo seja cancelado.

Eu acho que você vai realmente querer um semáforo, que tem uma contagem e suporta configuração n vezes para liberar n encadeamentos (mesmo se alguns desses encadeamentos só começarem a esperar depois de algumas das chamadas serem configuradas).


3 para resposta № 2

Depende do EventResetMode. Se estiver configurado para EventResetMode.AutoReset só liberará um segmento. Se for "EventResetMode.ManualReset", ele irá liberar todos os threads bloqueados no evento.

Semaphore.Release(Int)

Onde Int é a contagem seria 1 maneira de fazer isso.


1 para resposta № 3

Como Richard declarou, EventWaitHandles tem apenas um único sinalizador e não pode contar o número de vezes que Set foi chamado. A solução simplificada de adicionar uma variável count provoca uma condição de corrida.

William Kempf tem um artigo sobre por que as variáveis ​​de contagem não funcionam e uma solução usando a classe .Net Monitor.