"अक्षम फोर्क" न केवल आपके फोर्क द्वारा लॉन्च की गई प्रक्रियाओं को मारता है ... join_any, लेकिन किसी अन्य प्रक्रिया जो अक्षम प्रक्रिया के वंशज हैं जो अक्षम-कांटा निष्पादित करते हैं। यदि आपने इस प्रक्रिया के जीवन में पहले किसी अन्य प्रक्रिया को लॉन्च किया है (उदाहरण के लिए, फोर्क ... join_none), तो उन अन्य प्रक्रियाओं को भी मार दिया जाएगा।
आप अपने फोर्क के कारण आसानी से इसकी रक्षा कर सकते हैं ... join_any, और इसके बाद के अक्षम-कांटा, स्वयं की एक नई बाल प्रक्रिया में भाग लेने के लिए। यह आपके अक्षम-कांटा के प्रभाव को सीमित करता है ताकि यह केवल उन नई लॉन्च प्रक्रियाओं को प्रभावित कर सके जिनकी आप परवाह करते हैं, और अन्य कोई अवांछित प्रभाव होने की गारंटी नहीं है।
इस तरह "में शामिल होने कांटा शुरू ... अंत" में पूरी गंदगी संलग्न कर ऐसा करें:
fork begin // isolate the following code as a single child process
fork // launch the processes you wish to manage
apply_input();
update_status();
verify_status();
join_any // kill off the *_status threads when apply_input terminates
disable fork;
end join // end of child process isolation
इस के साथ कांटा ... join_any और कांटा ... join_none एक प्रसिद्ध मुद्दा है । हाल ही में सत्यापन गिल्ड फोरम पर चर्चा की गई है, और इसे सुथरलैंड और मिल्स पुस्तक "वेरिलोग और सिस्टम वेरिलोग गॉटचास" की धारा # 79 और # 80 में वर्णित किया गया है।
एकल लाइनों पर "कांटा शुरू करना" और "अंत में शामिल होना" रखना असामान्य है, लेकिन मुझे यह बहुत स्पष्ट बनाने के तरीके के रूप में पसंद है कि मैं सिंक्रनाइज़ रूप से एक बच्चे की प्रक्रिया को मजबूर कर रहा हूं। आम तौर पर यह करने के लिए एक बेकार बात होगी, लेकिन इस स्थिति में यह आवश्यक है।
यह मुहावरा, गलत पाने के लिए इतना आम है, और इसलिए आसान है, आप मैक्रो की एक जोड़ी में यह संपुटित करना पसंद करते हैं कि हो सकता है (मुझे यह पसंद नहीं है, लेकिन ...):
`define BEGIN_FIRST_OF fork begin fork
`define END_FIRST_OF join_any disable fork; end join
अब आप लिख सकते हैं ...
`BEGIN_FIRST_OF
apply_input();
update_status();
verify_status();
`END_FIRST_OF
जहां नाम "... FIRST_OF" वही चीज़ Specman (ई) भाषा निर्माण करने के लिए समानता को प्रतिबिंबित करना है।
यह एक उपयोगी प्रश्न में बदल सकता है: मैं कांटा को अक्षम करने के बाद सेमाफोर जारी नहीं कर रहा था जिससे कोई और लेनदेन नहीं हुआ। मैं वर्तमान में डीबगिंग कर रहा हूं बाद में – wisemonkey
अपडेट कर रहा हूं आप क्या करने की कोशिश कर रहे हैं? क्या आपको यकीन है कि आपको यहां समानांतर ब्लॉक की आवश्यकता है? –
धन्यवाद @ एडम 12 हाँ इन ब्लॉकों को समानांतर होने की आवश्यकता है, जिस तरह से मुझे कार्यक्षमता को सत्यापित करने की आवश्यकता है। मैं यह सत्यापित करने की कोशिश कर रहा हूं कि प्रगति पर विशेष रजिस्टर में अपडेट करते समय पढ़ा जाए तो वैध डेटा देता है। और हाँ मुद्दा इसलिए था क्योंकि मैं सेमफोर जारी नहीं कर रहा था। मैंने इसे हल कर लिया है और यह ठीक से काम कर रहा है – wisemonkey