2010-11-30 11 views
8

मैं लगातार एक बहुप्रचारित अनुप्रयोग में तारों को विभाजित कर रहा हूं, मैंने पढ़ा है कि strtok इसके लिए उपयुक्त नहीं है, लेकिन क्यों?मल्टीथ्रेडिंग और स्ट्रेटोक

क्या मुझे अपने कोड के हिस्से के आस-पास एक सेमफोर का उपयोग करने पर विचार करना चाहिए जो strtok पर कॉल करता है?

+0

डुप्लिकेट: http://stackoverflow.com/questions/4031075/strtok-function-thread-safety – Necrolis

+2

कृपया इसे डुप्लिकेट के रूप में बंद न करें। जवाब संबंधित हैं लेकिन यह वही नहीं है। यहां, ओपी इस बारे में सलाह मांग रहा है कि इसके कारण किसी समस्या को डीबग करने की बजाय 'स्ट्रोकोक' की गैर-पुनर्वित्त को कैसे संभाला जाए। –

उत्तर

9

आपको strtok या strtok_r का उपयोग न करने पर विचार करना चाहिए। इनके समान अपने स्वयं के कार्यों को लिखना तुच्छ है, लेकिन आप जिस तरह से उनका उपयोग करना चाहते हैं, उससे बेहतर तरीके से तैयार किए गए हैं, और निश्चित रूप से कॉलर सभी राज्यों को स्टोर करते हैं और थ्रेड-सुरक्षा/पुनर्वितरण के लिए राज्य में एक सूचक को पास करते हैं।

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

3

आपको strtok_r का उपयोग करने की आवश्यकता होगी।

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

+2

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

+0

धन्यवाद आर। मेरा जवाब भी अपडेट करेगा। – EboMike

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