首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找竞争条件的方法

查找竞争条件的方法
EN

Stack Overflow用户
提问于 2010-06-29 02:36:49
回答 8查看 14.9K关注 0票数 21

我有一些带有竞态条件的代码...我知道这是一种竞争情况,因为它不会持续发生,而且在双核机器上似乎更经常发生。

当我在追踪的时候从来没有发生过。不过,这也有可能是一个死锁。通过分析日志的完成阶段,我已经能够将这个bug精确地定位到单个函数。然而,我不知道这在函数的作用域中发生了什么。它不是在顶层。

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

除了获得一个竞态状态分析器之外,我还可以使用什么技术来精确定位发生这种情况的位置?

这是在visual studio 9中,使用C++ (非托管类型)。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-06-29 03:10:56

在代码的不同部分设置休眠。threadsafe的东西将是threadsafe,即使它(或异步代码)休眠甚至几秒钟。

票数 6
EN

Stack Overflow用户

发布于 2016-01-15 18:01:30

在CLang和gcc 4.8+中都包含了一个叫做ThreadSanitizer的工具。

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

示例:

代码语言:javascript
复制
$ 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);
}

和输出

代码语言:javascript
复制
$ 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
票数 10
EN

Stack Overflow用户

发布于 2010-06-29 02:47:23

实际上,有一些自动查找竞争条件的尝试。

  • Lockset-Based Race Checker
  • Happens-Before Race Detection
  • Hybrid Race Detection

我读到的另一个与竞争条件检测相关的术语是RaceFuzzer,但我找不到关于它的真正有用的信息。

我认为这是一个相对广泛的研究领域,所以据我所知,关于这个主题的主要是理论论文。然而,试着用谷歌搜索上面的关键字,也许你会找到一些有用的信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3135160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档