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:
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.
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