在编译时试图找到线程问题是否有任何意义?
我在谈论数据竞争,死锁,破坏状态等......
答案 0 :(得分:4)
虽然这不是编译时间,但您可能需要查看Helgrind:
<强>概述强>
Helgrind是一款Valgrind工具 检测C中的同步错误, 使用C ++和Fortran的程序 POSIX pthreads线程原语。
POSIX的主要抽象 pthreads是:一组线程共享 一个公共地址空间,线程 创建,线程连接,线程退出, 互斥(锁),条件变量 (线程间事件通知), 读写器锁,自旋锁, 信号量和障碍。
Helgrind可以检测到三类 错误,详细讨论 在接下来的三个部分中:
- 错误使用POSIX pthreads API。
- 锁定排序问题引起的潜在死锁。
- 数据竞赛 - 没有足够的锁定或访问内存 同步。
醇>这些问题经常导致 不可再现的,与时间有关的 崩溃,死锁等 行为不端,可能很难 通过其他方式找到。
Helgrind知道所有的pthread 抽象和跟踪他们的影响 尽可能准确。在x86和 amd64平台,它理解和 部分处理隐式锁定 因使用LOCK而产生 指令前缀。
Helgrind在你的时候效果最好 应用程序仅使用POSIX pthreads API。但是,如果你愿意的话 你可以使用自定义线程原语 可以描述他们的行为 Helgrind使用ANNOTATE_ *宏 在helgrind.h中定义。这个 在发布中添加了功能 Valgrind的3.5.0,被认为是实验性的。
由于Boost.Threads基于POSIX pthreads(至少在Linux上),我猜它也适用于它。
答案 1 :(得分:2)
虽然我不知道任何具有显式线程安全诊断选项的编译器,但Coverity是静态分析工具,它确实为并发问题提供了检查器,而这些问题在运行时没有完成松散可比性到“编译时”,因为编译器是一个工具,在生成代码之前对来的有效性做了一些静态分析,这似乎是你正在寻找的,不一定与编译时相关联,即在生成代码之前......
如果静态分析工具理解并发原语,则可以对线程问题进行静态分析。无论工具/编译器是否正确地指出了这些问题,我仍然需要经历。
注意:在工作中我们使用Coverity进行静态分析,但是当我们浏览工具指出的所有“问题”时,我们还没有启用并发检查器,因此我无法提供任何有关其工作原理的证明。至于其他更常见的检查员,他们指出了一堆有效的问题,以及一些无害的问题,以及一些误报。我希望尽快检查并发检查器的输出,以判断自己的用处。
答案 2 :(得分:1)
例如,您可能需要查看http://software.intel.com/en-us/articles/debugging-threaded-applications/。有专门用于此任务的软件,如http://software.intel.com/en-us/intel-thread-checker/。
编辑:抱歉,没有看到您要求编译时解决方案。也许这个答案仍然具有相关性。