Во время работы с дезинфицирующим средством для хлопковых нитей мы заметили предупреждения гонки данных. Мы считаем, что технология std::string copy-on-write не является потокобезопасной, но мы можем ошибаться. Мы уменьшили предупреждение, которое мы видели в этом коде:
void test3() {
std::unique_ptr<std::thread> thread;
{
auto output = make_shared<string>();
std::string str = "test";
thread.reset(new std::thread([str, output]() { *output += str; }));
// The str string now goes out of scope but due to COW
// the captured string may not have the copy of the content yet.
}
thread->join();
}
При компиляции с включенным дезинфицирующим средством потока:
clang++ -stdlib=libc++ -std=c++11 -O0 -g -fsanitize=thread -lpthread -o test main.cpp
или
clang++ -std=c++11 -O0 -g -fsanitize=thread -lpthread -o test main.cpp
И когда он запускается несколько раз, он в конечном итоге выдает это предупреждение:
WARNING: ThreadSanitizer: data race (pid=30829)
Write of size 8 at 0x7d0c0000bef8 by thread T62:
#0 operator delete(void*) <null>:0
...
Previous write of size 1 at 0x7d0c0000befd by thread T5:
#0 std::__1::char_traits<char>::assign(char&, char const&) string:639
...
Является ли это ложным положительным результатом дезинфицирующего средства для потока или это настоящая гонка данных? Если позднее, можно ли обходиться без изменения кода (например, передавая некоторые флаги компилятору), является ли это ошибкой в реализации строки (или что-то еще)?
UPDATE: выходы clang --version:
Ubuntu clang version 3.5-1ubuntu1 (trunk) (based on LLVM 3.5)
Target: x86_64-pc-linux-gnu
Thread model: posix
UPDATE: cpp Я использую, чтобы воспроизвести это предупреждение.