Ir para o conteúdo

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

valgrind --tool=helgrind ./a.out 

Podemos então ver a localização do deadlock; neste exemplo, ele aponta as posições nas quais as duas threads entraram em deadlock

thread_func2() (deadlock.cc:18)
thread_func1() (deadlock.cc:12)

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.

int shared_var = 0; 

void increment() {
    for (int i = 0; i < 100000; ++i) {
        ++shared_var; 
    }
}

Podemos ver em qual linha está o data race e então corrigir o problema.

datarace

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

Comentários