Leitura adicional:
Gostaria de apresentar alguns artigos meus, que estão interessados em primitivas de sincronização gerais e estão se aprofundando no Monitor, comportamento da instrução de bloqueio C #, propriedades e custos, dependendo de cenários distintos e número de threads. Ele está especificamente interessado em desperdício de CPU e períodos de capacidade para entender quanto trabalho pode ser realizado em vários cenários:
https://www.codeproject.com/Articles/1236238/Unified-Concurrency-I-Introduction
https://www.codeproject.com/Articles/1237518/Unified-Concurrency-II-benchmarking-methodologies
https: // www. codeproject.com/Articles/1242156/Unified-Concurrency-III-cross-benchmarking
Resposta original:
Oh céus!
Parece que a resposta correta sinalizada aqui como A RESPOSTA é inerentemente incorreta! Gostaria de pedir ao autor da resposta, respeitosamente, que leia o link do artigo até o final. artigo
O autor do artigo, de 2003 artigo foi medição em única máquina Dual Core e, no primeiro caso de medição, ele medido bloqueio com apenas um único segmento eo resultado foi de cerca de 50 ns por acesso de bloqueio.
Não diz nada sobre um bloqueio no ambiente simultâneo. Portanto, temos que continuar lendo o artigo e na segunda metade, o autor estava medindo o cenário de bloqueio com dois e três threads, que se aproxima dos níveis de simultaneidade dos processadores de hoje.
Então o autor diz, que com dois threads no Dual Core, os bloqueios custam 120ns, e com 3 threads vai para 180ns. Portanto, parece ser claramente dependente do número de threads acessando o bloqueio simultaneamente.
Portanto, é simples, não é 50 ns a menos que seja um único thread, onde o bloqueio fica inútil.
Outra questão a considerar é que é medido como o tempo médio !
Se o tempo das iterações fosse medido, haveria tempos pares entre 1ms a 20ms, simplesmente porque a maioria foi rápida, mas poucos encadeamentos estarão esperando pelo tempo dos processadores e incorrerão em atrasos de até milissegundos.
Isso é uma má notícia para qualquer tipo de aplicativo que requeira alto rendimento e baixa latência.
E a última questão a ser considerada é que pode haver operações mais lentas dentro da fechadura e, muitas vezes, é esse o caso. Quanto mais tempo o bloco de código for executado dentro da fechadura, maior será a contenção e os atrasos serão muito altos.
Considere que já se passou mais de uma década desde 2003, ou seja, poucas gerações de processadores projetados especificamente para funcionar totalmente simultaneamente e o bloqueio está prejudicando consideravelmente seu desempenho.