अंतिम अद्यतन:2026-10-12
Helgrind concurrency error detection¶
C++那些事 का helgrind से concurrency programming detection¶
आमतौर पर हम multithreaded programs लिखते समय दो समस्याएँ आसानी से आ जाती हैं:
- Deadlock हो गया, पता नहीं किस कारण से हुआ
- Data inconsistent, multiple threads ने locks गलत उपयोग किए
तो क्या इन दोनों परिदृश्यों को detect करने का कोई tool है?
उत्तर है हाँ, हम valgrind के helgrind tool से इन दोनों समस्याओं का पता लगा सकते हैं, इस लेख की व्याख्या को और सरल बनाने के लिए कुछ उदाहरण दिए गए हैं।
नोट: पूरे उदाहरण और उनके सुधारे गए रूप 星球 पर अपडेट किए जा चुके हैं।
Deadlock¶
मान लीजिए दो threads एक-दूसरे के locks पकड़े हुए हैं, ऐसी स्थिति में हम deadlock simulate कर सकते हैं, उदाहरण के लिए:
void thread_func1() {
std::lock_guard<std::mutex> lock1(mutex1);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::lock_guard<std::mutex> lock2(mutex2);
}
void thread_func2() {
std::lock_guard<std::mutex> lock2(mutex2);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::lock_guard<std::mutex> lock1(mutex1);
}
helgrind का उपयोग करने का तरीका इस प्रकार है:
इस समय हम deadlock की location देख सकते हैं, उदाहरण के लिए इस example में दिखाया गया है कि दो threads ने संबंधित स्थानों पर deadlock किया

Data race¶
मान लीजिए एक shared variable है, जिसे हम multiple threads से 10w बार increment करते हैं, तो परिणाम कितना होगा?
स्पष्ट है कि यहाँ multiple threads के global variable पर race की समस्या पैदा हुई है, अंतिम परिणाम inconsistent आता है, helgrind से detect करने का तरीका वही है जो ऊपर बताया गया।
इस समय हम देख सकते हैं कि data race वाली line कौन सी है, और फिर समस्या हल करें।

अंत में, कुछ प्रश्न छोड़ते हैं:
1.ऊपर के इन दोनों समस्याग्रस्त code को कैसे ठीक करें?
2.ऊपर बताए tool के अलावा, कोई और तरीका भी है?
इस section का अंत
संबंधित विषय¶
- C++ Concurrency in Action रीडिंग गाइड | C++那些事
- C++ deadlock जांच | C++那些事
- C++ SIMD vectorization | C++那些事
- C++17 parallel STL | C++那些事
- C++ False Sharing और cache line | C++那些事
- GDB multithread All-Stop डीबगिंग | C++那些事
- libev event loop का सिद्धांत | C++那些事
- C++ std::thread kernel implementation | C++那些事
- C++ std::thread और jthread | C++那些事
- C++ multithreading की शुरुआत | C++那些事