में लटकता है कुछ पृष्ठभूमि: मैं एक बग को ट्रैक करने की कोशिश कर रहा हूं जो मुझे प्रमुख सिरदर्द पैदा कर रहा है।प्रोग्राम विजुअल स्टूडियो डीबगर
....................................................................................................0
....................................................................................................1
....................................................................................................2
...........................
अजीब:
#include <thread>
#include <vector>
#include <iosfwd>
#include <sstream>
#include <string>
#include <windows.h>
int main()
{
SRWLOCK srwl;
InitializeSRWLock(&srwl);
for(size_t i=0;i<1000;++i)
{
std::vector<std::thread>threads;
for(size_t j=0;j<100;++j)
{
OutputDebugString(".");
threads.emplace_back([&](){
AcquireSRWLockExclusive(&srwl);
//Code below modifies the probability to see the bug.
std::this_thread::sleep_for(std::chrono::microseconds(1));
std::wstringstream wss;
wss<<std::this_thread::get_id();
wss.str();
//Code above modifies the probability to see the bug.
ReleaseSRWLockExclusive(&srwl);});
}
for(auto&t:threads){t.join();}
OutputDebugString((std::to_string(i)+"\n").data());
}
return 0;
}
जब मैं 2013 डिबगर वी.एस. अंदर इस कोड को चलाने के कार्यक्रम इस तरह एक उत्पादन के साथ लटका हुआ है: कई मृत समाप्त होता है (this question देखें) के बाद मैं अंत में इस कोड के साथ समाप्त हो गया पर्याप्त, अगर मैं डीबगर को रोकता हूं और निरीक्षण करता हूं कि क्या हो रहा है, तो थ्रेडों में से एक AcquireSRWLockExclusive (NtWaitForAlertByThreadId में) के अंदर है, जाहिर है कि प्रोग्राम लटक रहा है इसका कोई कारण नहीं है। जब मैं फिर से शुरू करता हूं, तो प्रोग्राम खुशी से जारी रहता है और फिर से अवरुद्ध होने तक कुछ और सामान प्रिंट करता है।
क्या आपके पास कोई विचार है कि यहां क्या हो रहा है?
कुछ अधिक जानकारी:
- जहां तक मेरा बता सकते हैं, इस बग केवल Windows 8.1 पर मौजूद है।
- मैंने वीएस2013.4 और वीएस2015 आरसी की कोशिश की।
- मैं इसे विंडोज 8.1 के तहत दो अलग-अलग कंप्यूटरों पर पुन: पेश कर सकता हूं।
- मशीन में से एक प्रारूप सही नहीं था, रैम, सीपीयू और डिस्क का परीक्षण किया (मैं एक खराबी के बारे में सोचा क्योंकि पहली बार में मैं केवल इस विशेष मशीन पर बग का निरीक्षण कर सकते हैं)
- मैं Windows 7. पर यह पुन: पेश नहीं कर सकता था
- बग का निरीक्षण करने के लिए टिप्पणियों के बीच कोड को संशोधित करना उपयोगी हो सकता है। जब मैंने माइक्रोसेकंद नींद को जोड़ा, तो मैं आखिरकार किसी अन्य कंप्यूटर पर बग को पुन: पेश कर सकता था।
- वीएस2015 आरसी के साथ मैं एक ही व्यवहार को एक साधारण std :: mutex के साथ पुन: पेश कर सकता हूं। वीएस2013 पर हालांकि SRWLOCK बग का पालन करना अनिवार्य लगता है।
क्या आप डेडलॉग में हो सकते हैं और एक बार जब आप डीबगर दर्ज कर लेते हैं तो यह सिंक्रनाइज़ेशन बदलता है और डेडलॉक गायब हो जाता है। – NathanOliver
@NathanOliver यह कैसे संभव हो सकता है? कोड में केवल एक म्यूटेक्स है। – Arnaud
क्या डीबगर के बाहर चलाने पर प्रोग्राम कभी लटका हुआ है? –