2009-09-01 10 views
5

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

जब चीजों को पैक करने और दूर जाने का समय होता है, तो मुख्य धागा बच्चे के धागे के रन-लूप पर CFRunLoopStop() को कॉल करता है, जिस बिंदु पर CFRunLoopRun() बच्चे के थ्रेड में वापस आता है, बाल थ्रेड निकलता है, और मुख्य धागा (जो बच्चे के धागे से बाहर निकलने के लिए इंतजार कर रहा था) जारी रख सकता है।

यह काम पर प्रतीत होता है, लेकिन मेरा सवाल यह है: क्या यह करने के लिए यह एक सुरक्षित/अनुशंसित तरीका है? विशेष रूप से, एक अन्य धागे से CFRunLoopStop() को रेस हालत का कारण बनने के लिए उत्तरदायी है? जहां तक ​​मैं कह सकता हूं, ऐप्पल का दस्तावेज इस विषय पर चुप है।

यदि मुख्य धागे से CFRunLoopStop() को कॉल करना समाधान नहीं है, तो एक अच्छा समाधान क्या है? मुझे पता है कि मेरे पास बच्चे थ्रेड कॉल CFRunLoopRunInMode() हो सकता है और बुलियन या कुछ जांचने के लिए हर बार जागता है, लेकिन अगर मैं इससे बच सकता हूं तो मैं बच्चे के धागे को कोई मतदान नहीं करना चाहूंगा।

उत्तर

2

विशेष रूप से, CFRunLoopStop() को किसी अन्य थ्रेड से सुरक्षित कर रहा है [सुरक्षित]?

यहाँ Run Loop Management कहते है:

कोर फाउंडेशन में काम करता है आम तौर पर धागे की सुरक्षित हैं और किसी भी धागे से कहा जा सकता है।

तो शायद CFRunLoopStop सुरक्षित है। लेकिन मैं "आम तौर पर" शब्द के उपयोग के बारे में चिंता करता हूं। मेरा नियम है: यदि ऐप्पल यह नहीं कहता कि यह सुरक्षित है, तो आपको यह मानना ​​चाहिए कि यह नहीं है।

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

11

CFRunLoopStop के मामले में - अगर इसे केवल वर्तमान रन लूप पर सुरक्षित रूप से बुलाया जा सकता है, तो इसे एक पैरामीटर पास करना आवश्यक नहीं होगा जो इंगित करता है कि कौन सा रन लूप रुक गया है।

पैरामीटर की उपस्थिति एक मजबूत संकेत है कि वर्तमान रन लूप के अलावा रन लूप को रोकने के लिए इसका उपयोग करना ठीक है।

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