2010-08-05 14 views
5

मैं एक ऐप विकसित कर रहा हूं जिसमें एक टीसीपी सर्वर और कई यूडीपी सर्वर/श्रोताओं हैं। प्रत्येक सर्वर एक अलग थ्रेड है, जो स्थापित टीसीपी कनेक्शन के लिए वर्कर थ्रेड के समान है। मैं प्रत्येक धागे में WSAStartup() को बुला रहा हूं।कई धागे से WSAStartup() को कॉल कर सकते हैं डेडलॉक का कारण बनता है?

कभी-कभी, WSAStartup() को कॉल करना (यह मेरे लिए एक डेडलॉक जैसा दिखता है)। यहां स्टैक ट्रेस है:

[email protected]() 
    [email protected]() + 0xc bytes 
    [email protected]() + 0x8c bytes 
    [email protected]() + 0x46 bytes 
    [email protected]() + 0x17d bytes 
    [email protected]() + 0x18 bytes 
    [email protected]() + 0x3e bytes 
    vld.dll!03203723() 
    [Frames below may be incorrect and/or missing, no symbols loaded for vld.dll] 
    ws2_32.dll!CheckForHookersOrChainers() + 0x22 bytes 
    [email protected]() + 0xa7 bytes 

यह डेडलॉक प्रारंभिक धुंध के दौरान होता है। मैं देखता हूं कि टीसीपी सर्वर शुरू हो गया है और एक टीसीपी कनेक्शन स्थापित किया गया है, जबकि यूडीपी सर्वरों में से केवल एक ही शुरू किया गया है। स्टैक ट्रेस फ़ंक्शन से है जो शेष यूडीपी सर्वरों को शुरू करना चाहिए। मेरा अनुमान है कि जब मैं यूडीपी सेवर में प्रवेश करने और WSACStartup() को कॉल करने की कोशिश कर रहा हूं, तो दूसरा ट्रेड एक और सॉकेट ऑपरेशन को संभालने का प्रयास कर रहा है, उदाहरण के लिए एक नया टीसीपी कनेक्शन और यह WSAStartup() को भी कॉल कर रहा है?

मेरा सवाल यह है कि क्या कई धागे से WSAStartup() को कॉल करना इस डेडलॉक का कारण बन सकता है? मैंने यह भी जांच की है कि WSACleanup() को डेडलॉक से पहले बुलाया गया है, और यह नहीं है। निष्पादन कभी भी WSACleanup() में से किसी तक नहीं पहुंचता है।

मुझे पता है कि WSAStartup के लिए केवल एक कॉल पर्याप्त होना चाहिए हूँ, अभी तक बुला WSAStartup() कई बार एक समस्या (MSDN] 1) नहीं होना चाहिए: "एक आवेदन करता है, तो यह करने की जरूरत है एक बार से अधिक WSAStartup कॉल कर सकते हैं एक बार से अधिक WSADATA संरचना जानकारी प्राप्त करें। " इसलिए, मैं यह स्थापित करना चाहता हूं कि यह डेडलॉक WSAStartup() या कुछ और के कारण होता है।

+0

यह आपके सवाल का कोई जवाब नहीं है, लेकिन आप को बढ़ावा देने asio (http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio.html उपयोग करने पर विचार किया)?मेरे पास उस लाइब्रेरी के साथ आपकी तरह की समस्याएं सुलझाने में बहुत आसान समय था। – nabulke

+0

निकोलाई, मैंने इससे पहले और इसे बढ़ावा दिया था। चूंकि मैंने WinSock के साथ इस ऐप को शुरू किया है, इसलिए मैं इस मुद्दे के निचले हिस्से तक पहुंचना चाहता हूं। मुझे लगता है कि उत्सुकता के लिए :) –

+0

क्या आपने अपने अन्य धागे के कॉल स्टैक को देखा था? –

उत्तर

2

आपको WSAStartup() पर कई बार कॉल करने की आवश्यकता नहीं है। एक बार प्रति कार्यक्रम ठीक है।

+1

इमो, प्रश्न स्पष्ट रूप से बताते हैं कि विषय स्टार्टर ने एमएसडीएन के इस हिस्से को पढ़ा है और समस्या से बचने के समाधान के बजाय (जो निश्चित रूप से एक अच्छा समाधान है) - वह मूल कारण खोजने की कोशिश कर रहा है। – Andrey

+0

यह पुराने मजाक की तरह है: "चिकित्सक, जब मैं ऐसा करता हूं तो दर्द होता है।" "तो ऐसा मत करो, फिर।" –

+1

इसे ट्रेड पर बुलाया जाना चाहिए जो सॉकेट बनाता है। – rxantos

0

मुझे लगता है कि ल्यूक सही है। आप WSAStartup() को DllMain() में या वैश्विक/स्थैतिक चर के प्रारंभकर्ताओं में कॉल नहीं कर सकते हैं। अपना कोड बदलें ताकि ऐसा न हो।

+0

मैं एक स्टैंडअलोन एप्लिकेशन पर काम कर रहा हूं और मैं सिस्टम डीएलएल का उपयोग कर रहा हूं, इसलिए मेरे पास DLLMain() नहीं है। WSAStartup() के लिए मेरी सभी कॉल थ्रेड फ़ंक्शंस में हैं: http://msdn.microsoft.com/en-us/library/ms686736(VS.85).aspx पीएस। (ओ/प्रोफाइलर, रिसाव डिटेक्टरों डब्ल्यू shell32.lib –

+0

करीब से अपने आवेदन की "रिहाई" संस्करण में लोड DLLs की सूची पर नजर डालें - ws2_32.lib - - strsafe.lib : यहां अतिरिक्त लाइब्रेरी की सूची है , आदि)। संभावना है कि उन डीएलएल में से एक विंडोज़ कार्यों को फँस रहा है। SysInternals 'प्रक्रिया एक्सप्लोरर आपको बहुत मदद करेगा। – Andrey

0

WSAStartup वास्तव में LoadLibrary किसी भी प्रकार की लिए नेतृत्व नहीं करता है, इसलिए मैं नहीं लग रहा है जैसे कि यह एक loader lock मामला है।

इसके बजाए, यह स्पष्ट है कि विंडोज एपीआई आपके मामले में फंस गया है (शब्द trap बेहतर है, क्योंकि hook विंडोज में अन्य अर्थ है)।

इस प्रकार, मुझे विश्वास है कि समस्या WSAStartup का साथ-साथ उपयोग में नहीं है, लेकिन अपनी प्रक्रिया में मूल Windows API कार्यों पर तीसरे पक्ष के जाल के दुष्प्रभाव में। मुझे लगता है, आपको किसी भी बाहरी प्रभाव से अपने पर्यावरण को साफ करने की आवश्यकता है (आपकी तरफ से एपीआई जाल या एंटी-वायरस सॉफ़्टवेयर से, जो भी हो)।

वैसे, यह सुनिश्चित करें कि तुम्हारा से प्रत्येक धागा WSADATA उत्पादन पैरामीटर

+1

क्या आप वाकई ** लोड लाइब्रेरी ** कॉल नहीं करते हैं? –

+0

आप सही हैं, मुझे याद नहीं है कि मैंने उस तरह वापस क्यों सोचा था, लेकिन यह वास्तव में एमएसडीएन के अनुसार सहायक डीएलएल लोड कर सकता है - इस प्रकार लोडर लॉक एक मुद्दा हो सकता है। मुझे अभी भी लगता है, ढेर को देखते हुए, मूल कारण एक जाल में है जो WSAStartup को अवरुद्ध करता है। – Andrey

3

WSAStartup समारोह आम तौर पर करने के लिए प्रोटोकॉल विशेष सहायक DLLs लोड किए जाने की ओर जाता है की अपनी अलग प्रति के साथ WSAStartup प्रदान करता है बनाते हैं। नतीजतन, WSAStartup फ़ंक्शन को DllMain फ़ंक्शन से अनुप्रयोग DLL में नहीं कहा जाना चाहिए। यह संभावित रूप से deadlocks का कारण बन सकता है। डीएलएम लोडर महत्वपूर्ण खंड में डेलमेन को बुलाया जाता है जो इस डेडलॉक का प्राथमिक कारण है।
अधिक जानकारी के लिए: http://msdn.microsoft.com/en-us/library/windows/desktop/ms742213%28v=vs.85%29.aspx