2012-06-30 14 views
5

लिखने समारोह से अधिक थ्रेड से कॉल का उपयोग कर GNU सी में लिखें समारोह का उपयोग करने के लिए है? क्या हम उनके बीच एक सिंक्रनाइज़ेशन जोड़ना चाहते हैं? यह इधर-उधर समस्याएं पैदा करेंगे आवेदन की तरह लिखने में देरी/लिनक्स Redhat वातावरण परइसे सुरक्षित एक ही सॉकेट</p> <p>यह सुरक्षित है के लिए एक से अधिक थ्रेड

हम जीएनयू सी ++ पुस्तकालयों उपयोग कर रहे हैं आवेदन परत को नेटवर्क परत जीसीसी 4 से पढ़ा

यह एक सर्वर साइड प्रक्रिया जहां है हो रही है वहाँ सर्वर & ग्राहक सर्वर & क्लाइंट के बीच केवल 1 सॉकेट कनेक्टिविटी है पर 2 diffent मशीनें डाटा हैं सर्वर

समस्या को क्लाइंट क्लाइंट के लिए सर्वर से भेजे जाने वाले है 1-जब सर्वर (क्लाइंट साइड को डेटा भेजने से अधिक थ्रेड Dat लिखें क्लाइंट साइड के माध्यम से एक ही सॉकेट के माध्यम से) लेकिन कुछ धागे से डेटा राइटन क्लाइंट साइड पर नहीं जाते हैं, यह नेटवर्क पर भी नहीं जाता है, उसी मशीन के लेयर (टीसीपीडम्प में वह डेटा नहीं है)

समस्या 2-जब क्लाइंट सर्वर डेटा पर डेटा भेजता है क्लाइंट द्वारा सर्वर के टीसीपीडम्प में सर्वर सर्वर के लिए प्राप्त नहीं किया जाता है जो एक थ्रेड से सॉकेट से पढ़ रहा है "0" & लूप में "चयन करें" फ़ंक्शन

हम इन समस्याओं को हल करने के पैटर्न की पहचान करने में असमर्थ थे, हमें लगता है कि यह बहुत खुशी है जब कई सारे धागे समान सॉकेट पर लिख रहे हैं हम सिंक्रनाइज़ेशन लिखने वाले फ़ंक्शन को सिंक्रनाइज़ेशन नहीं कर रहे हैं उम्मीद करते हैं कि ओएस सिंक्रनाइज़ेशन

012 को संभालने वाला है
+0

यह इस अर्थ में "सुरक्षित" है कि आपका प्रोग्राम अच्छी तरह से गठित है, लेकिन आपके सॉकेट पर जो परिणाम आप देखते हैं वह शायद नहीं हो सकता है। –

+0

@ केरेकस्क: यह एक अजीब टिप्पणी है। किसी भी थ्रेड-असुरक्षित प्रोग्राम को उस अर्थ में "सुरक्षित" कहा जा सकता है, नहीं? –

+0

@NedBatchelder: निश्चित रूप से नहीं। उदाहरण के लिए, एक फ़ंक्शन जो अपने आंतरिक राज्य-रखरखाव के लिए स्थिर बफर पर निर्भर करता है, वह * थ्रेड-सुरक्षित नहीं है, और एक प्रोग्राम जो इसे कई बार समेकित करता है, केवल बीमार है। इसके विपरीत, एक प्रोग्राम जो 'लिखने' को समवर्ती रूप से कॉल करता है वह स्वचालित रूप से बीमार परिभाषित नहीं होता है। –

उत्तर

0

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

+0

धन्यवाद नेड। क्या इससे समस्याएं पैदा हो जाएंगी? – samira

+0

@ सैमीरा: यह निश्चित रूप से आपके द्वारा वर्णित समस्याओं का कारण बन सकता है, लेकिन यह कहना असंभव है कि सिंक्रनाइज़ेशन कारण है या नहीं। –

+1

फ़ंक्शन तक पहुंचने पर आप म्यूटेक्स का उपयोग कर सकते हैं ताकि एक ही समय में केवल एक थ्रेड फ़ंक्शन तक पहुंच सके ... – shofee

1

लिखना() एक सिस्टम कॉल है, लाइब्रेरी फ़ंक्शन नहीं है, और सिस्टम कॉल आमतौर पर परमाणु होने की गारंटी दी जाती है।

+3

सच है, और सच नहीं है। सिस्टम कॉल परमाणु (और "सुरक्षित" होने की गारंटी है कि यह न तो क्रैश होगा और न ही आपके डेटा को दूषित करेगा) लेकिन इस बात की कोई गारंटी नहीं है कि दो थ्रेड द्वारा समेकित रूप से सबमिट (परमाणु रूप से) डेटा परमाणु रूप से _transferred_ है: [रोचक पढ़ना] http://www.almaden.ibm.com/cs/people/marksmith/sendmsg.html)। यह भी ध्यान रखें कि 'लिखने' और 'प्रेषण' तकनीकी रूप से आपके द्वारा पूछे जाने से कम लिखने की अनुमति है, इस मामले में आपको किसी अन्य लेखन ऑपरेशन के साथ जारी रखना होगा, वैसे भी सभी परमाणुओं को जब्त करना होगा। – Damon

0

यह निर्दिष्ट नहीं किया जाएगा कि write कॉल पहले पूर्ण हो जाता है। एक संदर्भ स्विच पहले निर्देश पर दो में से किसी एक को लिख सकता है। यह मनमाने ढंग से आदेश दे सकता है। write कुछ भी नहीं है या कर्नेल इसके बारे में कर सकता है। यह एक मौलिक समस्या है।

आपका डेटा अनिर्दिष्ट आदेश में लिखा जाएगा जो शायद आपको स्वीकार्य नहीं है।

संबंधित मुद्दे