"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > std::lock_guard vs. std::scoped_lock: quando escolher qual?

std::lock_guard vs. std::scoped_lock: quando escolher qual?

Publicado em 2024-11-08
Navegar:306

std::lock_guard vs. std::scoped_lock: When to Choose Which?

Contemplando std::lock_guard vs. std::scoped_lock

C 17 marcou a introdução de uma nova classe de bloqueio, std::scoped_lock , que compartilha semelhanças com o venerável std::lock_guard. Este artigo investiga as distinções entre esses dois mecanismos de bloqueio, orientando você na escolha da ferramenta ideal para suas necessidades específicas.

Quando utilizar std::lock_guard

Para cenários em que você precisa do bloqueio de um único mutex para todo o escopo, std::lock_guard oferece uma API mais segura do que std::scoped_lock. Considere o seguinte exemplo:

{
    std::scoped_lock lock;  // protect this block
    ...
}

Este snippet resulta inadvertidamente em um erro de tempo de execução porque se envolve em "comportamento invisível". Parece compilar sem problemas, mas, em última análise, não causa nenhum bloqueio. A funcionalidade pretendida provavelmente é necessária:

{
    std::scoped_lock lock{mut};  // protect this block
    ...
}

Esclarecer o mutex de destino para bloqueio resolve esse problema. Por outro lado, empregar std::lock_guard impediria a compilação do primeiro exemplo, tornando-o um erro claro em tempo de compilação.

Quando utilizar std::scoped_lock

Quando confrontado com situações em que vários mutexes precisam de bloqueio, std::scoped_lock brilha. Por exemplo:

{
    std::scoped_lock(lock1, lock2);  // protect this block
    ...
}

Este snippet bloqueia sucintamente dois mutexes durante o bloco.

Conclusão

Ambos std::lock_guard e std::scoped_lock atendem para cenários distintos:

  • std::lock_guard para bloquear um único mutex em todo um escopo.
  • std::scoped_lock para bloquear vários mutexes ou para desbloquear dentro do escopo fechado.

Enquanto std::scoped_lock fornece funcionalidade mais abrangente, std::lock_guard oferece segurança aprimorada de API em casos específicos. Considere cuidadosamente os requisitos do seu código ao selecionar a abordagem mais apropriada.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3