कृपया निम्नलिखित fork()
/SIGCHLD
छद्म कोड पर विचार करें।एक कांटा()/SIGCHLD दौड़ की स्थिति से बचें
// main program excerpt
for (;;) {
if (is_time_to_make_babies) {
pid = fork();
if (pid == -1) {
/* fail */
} else if (pid == 0) {
/* child stuff */
print "child started"
exit
} else {
/* parent stuff */
print "parent forked new child ", pid
children.add(pid);
}
}
}
// SIGCHLD handler
sigchld_handler(signo) {
while ((pid = wait(status, WNOHANG)) > 0) {
print "parent caught SIGCHLD from ", pid
children.remove(pid);
}
}
उपर्युक्त उदाहरण में रेस-हालत है। "/* child stuff */
" से पहले समाप्त होना संभव है "/* parent stuff */
" शुरू होता है जिसके परिणामस्वरूप बच्चे के पिड को बाहर निकलने के बाद बच्चों की सूची में जोड़ा जा सकता है, और कभी भी हटाया नहीं जा सकता है। जब ऐप बंद होने के लिए समय आता है, तो माता-पिता पहले से समाप्त होने वाले बच्चे को समाप्त होने के लिए अंतहीन रूप से इंतजार करेंगे।
एक समाधान मैं इसका सामना करने के बारे में सोच सकता हूं कि इसमें दो सूचियां हों: started_children
और finished_children
। मैं उसी स्थान पर started_children
में जोड़ूंगा जो मैं अब children
में जोड़ रहा हूं। लेकिन सिग्नल हैंडलर में, children
से हटाने की बजाय मैं finished_children
जोड़ सकता हूं। जब ऐप बंद हो जाता है, तो माता-पिता बस started_children
और finished_children
के बीच अंतर शून्य तक प्रतीक्षा कर सकते हैं।
एक और संभावित समाधान जो मैं सोच सकता हूं साझा साझा स्मृति का उपयोग कर रहा है, उदा। बच्चों की माता-पिता की सूची साझा करें और बच्चों को .add
और .remove
स्वयं को दें? लेकिन मुझे इसके बारे में बहुत कुछ पता नहीं है।
संपादित करें: एक और संभावित समाधान, जो पहली बात थी, ध्यान में रखकर, sleep(1)
को /* child stuff */
की शुरुआत में जोड़ना है, लेकिन यह मेरे लिए मजाकिया है, इसलिए मैंने इसे छोड़ दिया। मुझे यह भी यकीन नहीं है कि यह 100% तय है।
तो, आप इस दौड़-स्थिति को कैसे ठीक करेंगे? और यदि इसके लिए एक अच्छी तरह से स्थापित अनुशंसित पैटर्न है, तो कृपया मुझे बताएं!
धन्यवाद।
क्या यह सिर्फ मुझे है या सिग्नल हैंडलर असिंक-सुरक्षित नहीं है? बच्चों को कैसे हटाया जा सकता है .remove() संभवतः विस्फोट करने के लिए लागू किया जा सकता है जब एक नया सिग्लड मध्य में इसे बाधित करता है? –