2012-04-23 2 views
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 в порядке, так как доступ к нарушаться синхронизируется с мьютекс (и подобные комментарии говорят, что даже без этой программы гонки свободно). Но цзан жалуется и дает кучу предупреждений: http://www.filedropper.com/output Так я использую инструмент неправильно или это не очень хорошо? Если важно, я использую VS11 Beta.

+0

Программа была бы правильной даже без какой-либо синхронизации ... –

+0

Я догадался, я думаю, что первого соединения достаточно ... Я просто хотел быть уверенным. Ofc требуется второе соединение. – NoSenseEtAl

+0

Оба соединения необходимы, но так, как вы его написали, нет параллелизма. –

ответ

9

Это нормально, ThreadSanitizer не знает, как правильно обращаться с библиотеками потоков C++ 11, он также не может обрабатывать мелкозернистую синхронизацию с использованием Interlocked * или std :: atomic. Кроме того, гибридный режим может создавать ложные срабатывания. Вы можете создать файл подавления, чтобы игнорировать расы в стандартных библиотеках и других ложных срабатываниях. Используя ваш код на linux x64 и ThreadSanitizer, я получил 7 ложных гонок в stdlib. После добавления suppression file я смог проигнорировать эти гонки. Затем я удалил вашу блокировку и переместил ваш t1.join() после начала второго потока (так что есть настоящая гонка). ThreadSanitizer правильно определяет это. Затем я добавил твой мьютекс, и гонка больше не сообщалась. Так что это действительно кажется весьма полезным. Google использует его, чтобы найти гонки в браузере Chrome, среди многих других проектов, так что это довольно зрелый (хотя строительство на моем убунту 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 
} 
+0

очень хороший ответ – NoSenseEtAl

+0

btw Я не ожидаю поддержки C++ 11 в скором времени с тех пор, как код google не разрешает C++ 11. – NoSenseEtAl

+2

На своем сайте проекта он находится в кратковременном списке задач для ThreadSanitizer 2 (новая, более быстрая версия TSan, которая использует LLVM, но поддерживает только x64 linux atm.) – Eloff

Смежные вопросы