2010-06-23 59 views
4

在编译时试图找出线程问题有没有意义?查找线程错误

我说的数据竞争,死锁,损坏状态等等

+1

如果你有一个工具指出你在编译时线程问题,我会说,*“Offcourse”* ?! – 2010-06-23 07:45:58

回答

2

虽然我不知道有明确的线程安全诊断选项的任何编译器,Coverity的是静态分析工具,它确实为并发问题提供跳棋,它通过在运行时不能被做可能是松散堪比“编译时“,因为编译器是一个工具,它在生成代码之前会对来过程的有效性做一些静态分析,而这似乎是你正在寻找的东西,并不一定与编译时间相关,即在生成代码之前...

如果静态分析工具了解并发原语,那么可以对线程问题进行静态分析。无论工具/编译器是否处于正确指出这些问题的地步,我仍有待体验。

注意:在工作中,我们使用Coverity进行静态分析,但是当我们浏览该工具指向的所有“问题”时,我们还没有启用并发检查器,因此我无法给出任何关于它如何工作的证明。至于其他更常见的棋子,他们指出了一些有效的问题,以及一些无害的问题,以及一些误报。我希望尽快检查并发检查器的输出以判断自己的有用性。

4

虽然这不是编译时,你可能会想看看Helgrind

概述

Helgrind是 检测C, C++同步错误和Fortran一个Valgrind的工具使用POSIX pthreads线程原语的程序。

在POSIX的主要抽象 pthreads的是:一组线程共享 一个公共地址空间,螺纹 创建,螺纹接合,螺纹出口处, 互斥(锁),条件变量 的(线程间事件通知) , 读写器锁,自旋锁, 信号量和障碍。

Helgrind可以检测三类 错误,其详细 在接下来的三个部分中讨论的:

的POSIX API并行线程的
  1. 误用。
  2. 锁定顺序问题引起的潜在死锁。
  3. 数据竞赛 - 访问内存时没有足够的锁定或同步。

喜欢这些问题通常导致 不能再生,与时间相关的 崩溃,死锁等 不当行为,并且可能难以 查找其它手段。

Helgrind知道所有pthread 抽象并尽可能准确地跟踪其效果 。在x86和 amd64平台上,它理解并且 部分处理因使用LOCK 指令前缀而产生的隐式锁定 。

当您的 应用程序仅使用POSIX pthreads API时,Helgrind的效果最佳。但是,如果您想要 使用自定义线程原语,则您可以使用helgrind.h中定义的ANNOTATE_ *宏 将其行为描述为 Helgrind。 Valgrind的版本 3.5.0中添加了这个功能,并且被认为是实验性的。

由于Boost.Threads基于POSIX pthreads(至少在Linux上),我猜测它也可以。