4

我想尝试线程消毒剂( http://code.google.com/p/data-race-test/wiki/ThreadSanitizer#Using_ThreadSanitizer)所以我做了一个简单的程序:

#include <thread>
#include <atomic>
#include <vector>
#include <iostream>
#include <algorithm>
#include <mutex>
using namespace std;
int violated=0;
mutex mtx;
void violator()
{
    lock_guard<mutex> lg(mtx);
    violated++;
}
int main()
{
    thread t1(violator);
    t1.join();
    thread t2(violator);
    t2.join();
}

AFAIK 程序是可以的,因为对违反的访问与互斥锁同步(就像评论说即使没有该程序也是无种族的)。但是 tsan 抱怨并给出了一堆警告: http://www.filedropper.com/output 那么我使用该工具是错误的,还是它不是很好?如果重要的话,我正在使用 VS11 Beta。

4

1 回答 1

12

这很正常,ThreadSanitizer 不知道如何正确处理 C++11 线程库,它也无法使用 Interlocked* 或 std::atomic 处理细粒度同步。此外,混合模式会产生误报。您可以构建抑制文件以忽略标准库中的竞争和其他误报。在 linux x64 和 ThreadSanitizer 上使用你的代码,我在 stdlib 中得到了 7 个错误的比赛。添加抑制文件后我能够忽略这些比赛。然后我删除了你的锁并将你的 t1.join() 移动到第二个线程开始之后(所以有一个真正的比赛。) ThreadSanitizer 正确地检测到了这一点。然后我重新添加了您的互斥锁,不再报告比赛。所以它实际上看起来非常有用。谷歌使用它在他们的 Chrome 浏览器中查找比赛,以及许多其他项目,所以它非常成熟(尽管在我的 ubuntu 12.10 系统上构建它真的很痛苦。)

对于 linux,我的抑制文件如下所示:

{
<std::shared_ptr>
ThreadSanitizer:Race
...
fun:std::_Sp_counted_base::_M_release
fun:std::__shared_count::~__shared_count
fun:std::__shared_ptr::~__shared_ptr
}
{
<std::arena_thread_freeres>
ThreadSanitizer:Race
fun:arena_thread_freeres
fun:__libc_thread_freeres
fun:start_thread
}
于 2012-10-31T01:33:05.620 回答