2011-06-15 13 views
6
 pthread_create(&thread, NULL, AcceptLoop, (void *)this); 

मैंने इस तरह घोषित किया है और AcceptLoop फ़ंक्शन के अंदर मेरे पास अनंतता है जबकि लूप। सर्वर बंद होने पर मैं इस थ्रेड को बंद करना चाहता हूं। मैंने pthread_cancel और pthread_join पढ़ा है लेकिन मुझे यकीन नहीं है कि कौन सा बेहतर और सुरक्षित है। मैं कुछ विस्तृत निर्देश या ट्यूटोरियल सुनना चाहता हूं। अग्रिम में धन्यवाद।मैं थ्रेड को सुरक्षित रूप से कैसे बंद करूं?

उत्तर

1

मेरा मानना ​​है कि आप मुख्य थ्रेड से संकेत देकर कार्यकर्ता धागा बाहर निकलने के लिए चाहते हैं।

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

यदि आप अपने मुख्य धागे को बाहर निकलने के लिए बाल धागे की प्रतीक्षा करना चाहते हैं तो आप ऐसा करने के लिए pthread_join का उपयोग कर सकते हैं।

सामान्य तौर पर, एक बच्चे धागा तीन की स्थिति में बाहर निकल सकते हैं:

  1. pthread_exit बुला।
  2. pthread_cancel पर कॉल करना।
  3. धागा फ़ंक्शन देता है।
2

आपको कुछ भी करने की आवश्यकता नहीं है, केवल थ्रेड फ़ंक्शन से लौटने से थ्रेड को साफ-सुथरा कर दिया जाएगा। आप वैकल्पिक रूप से pthread_exit() पर कॉल कर सकते हैं लेकिन मैं बदलेगा। pthread_cancel() डरावना और जटिल/सही पाने के लिए कठिन है। यदि संभव हो तो स्पष्ट रहें। pthread_join() अधिकतर आवश्यक है यदि आप जानना चाहते हैं कि थ्रेड खत्म होने पर और return मान में रुचि रखते हैं।

ओउप्स, मैं गलत हूं। यह कुछ समय हो गया है। मैंने जो कहा है उसके लिए, आपको अपने धागे से अलग होना चाहिए। नहीं तो आप pthread_join कॉल करने के लिए की आवश्यकता होगी:

या तो pthread_join (3) या pthread_detach(), प्रत्येक थ्रेड कि एक आवेदन पत्र बनाता है के लिए बुलाया जाना चाहिए ताकि धागा के लिए कि सिस्टम संसाधन हो सकता है जारी किया । (लेकिन ध्यान दें कि सभी धागे के संसाधनों मुक्त कर दिया जाता है जब प्रक्रिया समाप्त हो जाता है।)

http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_detach.3.html

+2

यह सब इस बात पर निर्भर करता है कि धागा अलग हो गया है या नहीं। यदि ऐसा नहीं है, तो थ्रेड मेमोरी को साफ करने के लिए आपको थ्रेड को pthread_join करना होगा। यदि आपने अलग किया है तो हाँ मुख्य फ़ंक्शन या pthread_exit() से लौट रहा है। – Suroot

+0

@ सुरूट आप 100% सही हैं, मैंने प्रतिबिंबित करने के लिए अपना जवाब संपादित किया। –

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