C ++ 11 read-read-read数据与memcpy竞争

时间:2016-08-09 22:34:12

标签: multithreading concurrency

我正在使用线程清理程序(TSAN)来检测多进程和多线程程序中的数据争用。我使用C ++ 11,gcc 5.3.0,MPI(MPICH 3.2)进行进程间通信,使用std :: thread进行并发。我在Linux上运行(Linux ronni 3.13.0-52-generic#86-Ubuntu SMP Mon May 4 04:32:59 UTC 2015 x86_64 x86_64 x86_64 GNU / Linux)

TSAN正在检测缓冲区上的数据争用,该缓冲区由一个线程写入并由多个线程读取。事实上,一个编写器线程既将缓冲区传递给其进程中的其他线程,也通过MPI传递给其他进程。

这是伪代码:

void* shared_buffer;

WRITER THREAD:
// W0. write to shared_buffer

// W1. signal to readers that it's ok to read shared_buffer

// W2. give buffer to MPI, which uses it to send to other processes. At some point, the MPI runtime does a memcpy from shared_buffer into another buffer that it uses for its interprocess communication.

// W3. barrier


READER THREADS:
// R1. wait until it's ok to read shared_buffer

// R2. read shared_buffer

// R3. barrier

TSAN正在检测R2与在MPI运行时调用的memcpy之间读取数据之后的写入,即使shared_buffer只能由memcpy严格读取,而不是写入。当我切换W1和W2的顺序时,TSAN错误就消失了。

但是,我宁愿将此订单作为优化。我的程序运行良好(没有崩溃或不确定性),我得到了“正确答案”。

所以,我想知道这个TSAN警告是假阳性,还是我应该担心的事情。我通常更喜欢保持我的代码“TSAN-clean”。 memcpy实际上可以在memcpy的过程中修改它的源参数吗?

以下是被标记的特定memcpy行:

  Write of size 8 at 0x7d7c0000a800 by thread T2 (mutexes: write M98):
    #0 memcpy /scratch/m/gcc/src/gcc-5.3.0/libsanitizer/tsan/tsan_interceptors.cc:638 (libtsan.so.0+0x000000025b5a)
    #1 MPIDI_CH3U_Receive_data_found src/mpid/ch3/src/ch3u_handle_recv_pkt.c:152 (libmpi.so.12+0x0000002073ff)

0 个答案:

没有答案