
Gaetano Mendola wrote:
I'm using clang 3.6 with boost 1.54
$ clang-3.6 --version Ubuntu clang version 3.6.0-svn225356-1~exp1 (trunk) (based on LLVM 3.6.0) Target: x86_64-pc-linux-gnu Thread model: posix
Compiling the code here: http://pastebin.com/zh0SPz5n
$ clang++-3.6 -g main.cpp -lboost_system -lboost_thread -fsanitize=thread
I get at runtime:
================== WARNING: ThreadSanitizer: data race (pid=5592) Write of size 8 at 0x7d080000cfe8 by thread T2 (mutexes: write M18): #0 operator delete(void*) <null> (a.out+0x00000045febb) ...
I believe this is a false alarm indeed the two threads are working on their own shared_ptr copy and thePtr shared pointer write/read in the two threads is protected with a mutex.
I can't see anything wrong with your code; clang's thread sanitizer probably doesn't understand our homegrown atomic operations in sp_counted_base_gcc_x86.hpp because they use inline assembly. You should try the same with -DBOOST_SP_USE_STD_ATOMIC, which will use std::atomic. It's possible that the sanitizer understands standard atomics better. Failing that, next thing to try is -DBOOST_SP_USE_PTHREADS.