Conceitos relacionados a threads 1. Sincronização de threads ManualResetEvent O método Set() define o estado como Sinalizado Reset() para definir como sem sinal WaitOne() bloqueia até ter sinal, e se houver sinal no momento de chamar WaitOne, ele não bloqueia AutoResetEvent A diferença em relação ao ManualResetEvent é que o AutoResetEvent.WaitOne() muda automaticamente o estado do objeto do evento, ou seja, o estado do evento muda toda vez que o AutoResetEvent.WaitOne() é executado. Sinal - > sem sinal; Sem sinal – > tem sinal
example:
myResetEven.Set(), que na verdade é equivalente a um switch, se o método set() não for executado, o seguinte waitOne() não poderá esperar a notificação para deixá-lo executar, de modo que a instrução após waitOne não será executada. Método do monitor O mecanismo Wait() Pulse() é usado para interação entre threads, quando um objeto emite Monitor.Wait(), a thread que está acessando o objeto permanecerá no estado de espera. até receber um sinal de acordar. Monitor.Pulse() é usado para enviar sinais ao thread em espera. Ou seja, na área crítica entre Monitor.Enter() e Monitor.Exit(), para liberar o bloqueio do objeto e bloquear a thread atual, ele está em estado de espera na fila.
Lock é diferente do Mutex Sincronização de travas entre múltiplas threads Sincronização de múltiplas threads entre processos Mutex, ou sincronização de múltiplos processos Na programação multithread .Net, as classes AutoResetEvent e ManualResetEvent são frequentemente usadas, e seu uso é muito semelhante, mas há diferenças. O método Set coloca o sinal no estado de envio, o método Reset coloca o sinal no estado não-envio, e o WaitOne espera o sinal ser enviado. O estado inicial do construtor pode ser determinado pelo valor do parâmetro; se for verdadeiro, não está bloqueando, e falso é o estado de bloqueio. Se uma thread chama o método WaitOne, a thread recebe o sinal quando está no estado de envio e continua executando para baixo. A diferença é que, após a chamada, o AutoResetEvent.WaitOne() permite que apenas uma thread entre por vez, e quando uma thread recebe um sinal, o AutoResetEvent automaticamente coloca o sinal em estado de não enviar, e as outras threads que chamam o WaitOne só podem continuar esperando. Ou seja, o AutoResetEvent desperta apenas um thread por vez; O ManualResetEvent pode ativar múltiplas threads, porque quando uma thread chama o método ManualResetEvent.Set(), as outras threads que chamam o WaitOne recebem o sinal para continuar a execução, e o ManualResetEvent não configura automaticamente o sinal para não ser enviado. Em outras palavras, a menos que o método ManualResetEvent.Reset() seja chamado manualmente, o ManualResetEvent permanecerá sinalizado e o ManualResetEvent pode ativar múltiplas threads ao mesmo tempo para continuar a execução. |