我想到了尝试螺纹消毒剂( 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程序是OK,因为访问违反了与互斥同步(和评价,比如说,即使没有该程序是免费的种族)。 但灿抱怨,并给出了一堆警告: http://www.filedropper.com/output所以我使用的工具不对,或者是不是真的好? 如果重要的我使用VS11 Beta版。
这是正常的,ThreadSanitizer不知道如何处理正确地与C ++ 11线程库,也不能处理细粒度的同步使用互锁*或std ::原子。 此外,该混合模式可以产生假阳性。 你可以建立一个抑制文件忽略标准库和其它误报比赛。 使用上的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
}