gpt4 book ai didi

c++ - 寻找竞争条件的方法

转载 作者:IT老高 更新时间:2023-10-28 22:03:30 25 4
gpt4 key购买 nike

我有一些代码中包含竞态条件...我知道这是一个竞态条件,因为它不会始终如一地发生,而且它似乎在双核机器上更频繁地发生。

当我追踪时,它永远不会发生。虽然,它也有可能是一个僵局。通过分析发生和未发生这种情况的日志完成阶段,我已经能够将此错误定位到单个函数。但是,我不知道这是在函数范围内发生的。它不在顶层。

如果是竞态条件,添加日志语句或断点会改变时间,并防止这种情况发生。

除了获得一个可以让我查明发生这种情况的竞争条件分析器之外,我还可以使用什么技术吗?

这是在 Visual Studio 9 中,使用 C++(非托管品种)。

最佳答案

CLang 和 gcc 4.8+ 中包含一个名为 ThreadSanitizer 的工具.

您使用 -fsanitize=thread 标志编译您的代码

例子:

$ cat simple_race.cc
#include <pthread.h>
#include <stdio.h>

int Global;

void *Thread1(void *x) {
Global++;
return NULL;
}

void *Thread2(void *x) {
Global--;
return NULL;
}

int main() {
pthread_t t[2];
pthread_create(&t[0], NULL, Thread1, NULL);
pthread_create(&t[1], NULL, Thread2, NULL);
pthread_join(t[0], NULL);
pthread_join(t[1], NULL);
}

还有输出

$ clang++ simple_race.cc -fsanitize=thread -fPIE -pie -g
$ ./a.out
==================
WARNING: ThreadSanitizer: data race (pid=26327)
Write of size 4 at 0x7f89554701d0 by thread T1:
#0 Thread1(void*) simple_race.cc:8 (exe+0x000000006e66)

Previous write of size 4 at 0x7f89554701d0 by thread T2:
#0 Thread2(void*) simple_race.cc:13 (exe+0x000000006ed6)

Thread T1 (tid=26328, running) created at:
#0 pthread_create tsan_interceptors.cc:683 (exe+0x00000001108b)
#1 main simple_race.cc:19 (exe+0x000000006f39)

Thread T2 (tid=26329, running) created at:
#0 pthread_create tsan_interceptors.cc:683 (exe+0x00000001108b)
#1 main simple_race.cc:20 (exe+0x000000006f63)
==================
ThreadSanitizer: reported 1 warnings

关于c++ - 寻找竞争条件的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3135160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com