मैंने चारों ओर बिखरी हुई जानकारी के बिट्स को देखा है, लेकिन मुझे एक अंतिम उत्तर नहीं मिल रहा है। आप कर्नेल में ज़ोंबी थ्रेड कैसे साफ करते हैं?कर्नेल में धागे को संभालने का सही तरीका?
बस सुनिश्चित करने के लिए, और कर्नेल में धागे को संभालने का अंतिम सही तरीका तैयार करने के लिए, मैं इस सवाल को अधिक व्यापक रूप से पूछना चाहता हूं। लिनक्स कर्नेल में थ्रेड कैसे बनाते हैं, समाप्त करते हैं और साफ करते हैं?
क्या मैं अब तक किया है इस:
thread_func:
exited = 0;
while (!must_exit)
do stuff
exited = 1;
do_exit(0)
init_module:
must_exit = 0;
exited = 1;
kthread_run(thread_func, ...) /* creates and runs the thread */
cleanup_module:
must_exit = 1;
while (!exited)
set_current_state(TASK_INTERRUPTIBLE);
msleep(1);
/* How do I cleanup? */
निकटतम बात मैं सफाई समाधान के लिए मिल गया है release_task है, लेकिन मैं कहीं भी इसके बारे में बात भी नहीं मिला। मैंने कल्पना की है कि थ्रेड फ़ंक्शंस kthread_create
, kthread_run
आदि हैं, kthread_join
या kthread_wait
होना चाहिए, लेकिन वहां नहीं था। do_wait
भी लग रहा था, लेकिन यह struct task_struct *
नहीं लेता है।
इसके अलावा, मुझे यकीन नहीं है कि do_exit
एक अच्छा विचार है, या यदि आवश्यक हो तो। क्या कोई कृपया न्यूनतम स्केच के साथ आ सकता है कि कैसे एक kthread बनाया जाना चाहिए, समाप्त और साफ किया जाना चाहिए?
मुझे याद है कि एक kthread_stop है, या kthread_should_stop, ऐसा कुछ है। –
@ मार्टिनजम्स, जिस तरह से मैंने समझा, आप या तो स्वयं से बाहर निकलें ('do_exit' का उपयोग करके) या 'kthread_should_stop'' मतदान करें जब तक कि कोई (' cleanup_module') 'kthread_stop'' कॉल न करे। मुझे कहीं भी यह नहीं मिला कि 'kthread_stop' भी धागे को साफ करता है या नहीं। मुझे आश्चर्य की बात यह है कि, अगर लोग (इंटरनेट पर) 'do_exit' या जो कुछ भी इस्तेमाल करते हैं, तो' do_exit' के बाद थ्रेड को साफ़ करने का कोई तरीका नहीं होना चाहिए? – Shahbaz
वैसे, [यह] (http://lwn.net/Articles/65178/) मैं तब कहता हूं जब मैं कहता हूं कि मैं एक निर्णायक उत्तर तक नहीं पहुंच सकता। वहां बहुत सारी विवादित चीजें हैं। – Shahbaz