क्लैंग के थ्रेड सैनिटाइज़र के साथ काम करते समय हमने डेटा रेस चेतावनियां देखीं। हमें लगता है कि यह std :: स्ट्रिंग की कॉपी-ऑन-राइट तकनीक के कारण थ्रेड सुरक्षित नहीं है, लेकिन हम गलत हो सकते हैं। जब धागे से संकलित प्रक्षालक सक्षमएक बहु थ्रेडेड वातावरण में std :: स्ट्रिंग का उपयोग करते समय क्लैंग का थ्रेड सैनिटाइज़र चेतावनी
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
...
क्या यह थ्रेड सैनिटाइज़र से झूठा सकारात्मक है या क्या यह वास्तविक डेटा रेस है? यदि बाद में, कोड को बदलने के बिना इसे चारों ओर काम किया जा सकता है (उदाहरण के लिए कंपाइलर को कुछ झंडे पास करके), क्या यह स्ट्रिंग इम्प्लेमेंटेशन (या कुछ और) में एक बग है?
अद्यतन: बजना --version आउटपुट:
Ubuntu clang version 3.5-1ubuntu1 (trunk) (based on LLVM 3.5)
Target: x86_64-pc-linux-gnu
Thread model: posix
अद्यतन: The cpp मैं इस चेतावनी पुन: पेश करने का उपयोग करें।
libC++ गाय तारों का उपयोग नहीं करना चाहिए, इसलिए मुझे आश्चर्य होगा अगर गाय स्ट्रिंग इसका कारण हैं। – hvd
@ बार्टोज़्ज़केपी, हां, क्षमा करें, यह एक गाय समस्या है, परीक्षण अनुमान में तर्क से समर्थित हमारे अनुमान थे। अनिवार्य रूप से हमें कोड थ्रेड को सुरक्षित करने की आवश्यकता है, समस्या यह है कि कभी-कभी हमें अंदर से इसी तरह की चेतावनियां मिलती हैं उदा। boost :: asio ताकि हम कोड को बदलने की स्थिति में हमेशा न हों। –
क्लैंग का थ्रेड सैनिटाइज़र एक अच्छा उपकरण है, लेकिन सभी तरह के म्यूटेक्स और अन्य सिंक्रनाइज़ेशन तकनीकों को सही ढंग से समझना बहुत मुश्किल है। यहां मामला हो सकता है - मुझे इससे कुछ झूठे अलार्म मिल गए हैं, उदाहरण के लिए, यह क्यूटी के म्यूटेक्स को समझ में नहीं आता है। – BartoszKP