As diferenças entre variáveis ??condicionais, Mutexes e Locks
-
20-08-2019 - |
Pergunta
Por exemplo, o c ++ 0x interfaces de
Eu estou tendo um momento difícil descobrir quando usar cada uma destas coisas (cv, mutex e de bloqueio). Alguém por favor pode explicar ou apontar para um recurso?
Agradecemos antecipadamente.
Solução
Na página que você se refere, "mutex" é o baixo nível actual sincronização primitiva. Você pode tomar um mutex e depois liberá-lo, e apenas um thread pode levá-lo a qualquer momento único (portanto, é uma sincronização primitiva). Um mutex recursiva é aquela que pode ser tomada pelo mesma enfiar várias vezes, e em seguida, ele precisa ser liberado tantas vezes pelo mesmo thread antes de outros pode levá-lo.
A "bloqueio" aqui é apenas um C ++ invólucro classe que leva um mutex em seu construtor e libera-lo no processo de destruição. É útil para o estabelecimento de sincronização para escopos C ++.
Uma variável condição é uma forma mais avançada / de alto nível de sincronização primitiva que combina uma fechadura com um mecanismo de "sinalização". É usado quando tópicos precisa esperar por um recurso se torne disponível. Um thread pode "esperar" em um CV e, em seguida, o produtor recurso pode "sinal" a variável, caso em que os tópicos que esperam para o CV ser notificado e pode continuar a execução. Um mutex é combinado com CV para evitar a condição de corrida onde um fio começa a esperar em um CV, ao mesmo tempo outro segmento quer sinalizar que; então não é controlável se o sinal é entregue ou se perde.
Outras dicas
Eu não sou muito familiarizado w / C ++ 0x assim que tomar esta resposta w / um grão de sal.
re: Mutex vs. fechaduras: A partir da documentação você postou, parece um mutex
é um objeto que representa um mutex OS, enquanto um lock
é um objeto que detém uma exclusão mútua para facilitar a padrão RAII .
Variáveis ??de condição são um mecanismo útil para associar um bloqueio / sinalização mecanismo (sinal + espera) com um mecanismo de exclusão mútua, mas mantê-los dissociado no sistema operacional para que você como programador de sistema pode escolher a associação entre condvar e mutex. (Útil para lidar com múltiplos conjuntos de objetos simultaneamente acessados) Rob Krten tem algum boas explicações sobre condvars em um dos capítulos on-line de sua livro sobre QNX .
Quanto referências gerais:. Este livro (ainda não out) parece interessante