Última atualização:2026-10-12
Detecção de Erros de Concorrência com Helgrind¶
C++那些事: detecção de concorrência com helgrind¶
Ao escrever programas multi-thread normalmente encontramos dois problemas com facilidade:
- deadlock sem saber a causa
- inconsistência de dados por uso incorreto de locks entre várias threads
Existe alguma ferramenta para detectar esses dois cenários?
A resposta é sim: podemos usar a ferramenta helgrind do valgrind para detectar esses dois problemas. Para tornar a explicação mais fluida, apresento alguns exemplos.
Nota: os exemplos completos e as correções foram publicados no Planeta do Conhecimento.
Deadlock¶
Suponha duas threads que mutuamente detêm o lock uma da outra; assim podemos simular um deadlock, por exemplo:
void thread_func1() {
std::lock_guard<std::mutex> lock1(mutex1);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::lock_guard<std::mutex> lock2(mutex2);
}
void thread_func2() {
std::lock_guard<std::mutex> lock2(mutex2);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::lock_guard<std::mutex> lock1(mutex1);
}
O uso do helgrind é o seguinte:
Podemos então ver a localização do deadlock; neste exemplo, ele aponta as posições nas quais as duas threads entraram em deadlock

Data race¶
Suponha uma variável compartilhada que incrementamos 100 mil vezes em múltiplas threads; qual será o resultado?
Claramente há um problema de corrida sobre a variável global entre threads, com resultado final inconsistente; o método de detecção com helgrind é o mesmo acima.
Podemos ver em qual linha está o data race e então corrigir o problema.

Por fim, deixo algumas perguntas:
1.Como corrigir esses dois códigos com problema?
2.Além da ferramenta acima, existem outras formas?
Fim da seção
Tópicos relacionados¶
- Guia de C++ Concurrency in Action | C++那些事
- Depuração de Deadlocks em C++ | C++那些事
- Vetorização SIMD em C++ | C++那些事
- STL Paralela do C++17 | C++那些事
- False Sharing e Linhas de Cache em C++ | C++那些事
- Depuração All-Stop multi-thread com GDB | C++那些事
- Princípio do event loop do libev | C++那些事
- Implementação interna de std::thread em C++ | C++那些事
- C++ std::thread e jthread | C++那些事
- Introdução a multi-thread em C++ | C++那些事