रूप @sarnold ने बताया डिफ़ॉल्ट अपने धागा किसी भी कार्य करता है कि रद्द अंक हैं बुला बिना pthread_cancel()
साथ रद्द नहीं किया जा सकता से ... लेकिन यह कर सकते हैं थ्रेड के रद्दीकरण प्रकार को स्थगित करने के बजाय एसिंक्रोनस पर सेट करने के लिए pthread_setcanceltype()
का उपयोग कर बदला जा सकता है। ऐसा करने के लिए, आप लूप शुरू करने से पहले, अपने थ्रेड फ़ंक्शन की शुरुआत के करीब pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
जैसे कुछ जोड़ देंगे। इसके बाद आप main()
से pthread_cancel(th)
फोन करके धागा समाप्त करने में सक्षम हो जाएगा।
नोट, हालांकि, धागे को इस तरह से रद्द करना (चाहे असीमित या नहीं) थ्रेड फ़ंक्शन में आवंटित किसी भी संसाधन को साफ़ नहीं करता है (जैसा कि केविन द्वारा टिप्पणी में उल्लेख किया गया है)। आदेश में इस सफाई से करने के लिए, आप कर सकते हैं:
- सुनिश्चित करें कि धागा कुछ भी यह (जैसे
malloc()
का उपयोग कर एक बफर आवंटित करने के लिए)
- सुनिश्चित करें कि आप किसी तरह से है कि बाहर निकलने से पहले साफ करने के लिए की जरूरत है ऐसा नहीं करता है कहीं और धागा के बाद सफाई, धागा के बाद
- उपयोग
pthread_cleanup_push()
और pthread_cleanup_pop()
सफाई संचालकों को जोड़ने के लिए संसाधनों को साफ करने के लिए जब धागा रद्द कर दिए जाने से निकल जाता है की। ध्यान दें कि रद्दीकरण प्रकार असीमित है, तो यह अभी भी जोखिम भरा है, क्योंकि संसाधन को आवंटित करने और क्लीनअप हैंडलर जोड़ने के बीच धागा रद्द किया जा सकता है।
pthread_cancel()
का उपयोग करने से बचें और थ्रेड को निर्धारित करने के लिए कुछ शर्त जांचें (जिसे लंबे समय तक चलने वाले लूप में चेक किया जाएगा)। चूंकि आपका धागा समाप्त होने के बाद जांचता है, यह जांच के बाद जो कुछ भी सफाई की आवश्यकता है, वह कर सकता है। धागा नहीं है, तो #include <pthread.h>
#include <unistd.h>
#include <errno.h>
/* Returns 1 (true) if the mutex is unlocked, which is the
* thread's signal to terminate.
*/
int needQuit(pthread_mutex_t *mtx)
{
switch(pthread_mutex_trylock(mtx)) {
case 0: /* if we got the lock, unlock and return 1 (true) */
pthread_mutex_unlock(mtx);
return 1;
case EBUSY: /* return 0 (false) if the mutex was locked */
return 0;
}
return 1;
}
/* Thread function, containing a loop that's infinite except that it checks for
* termination with needQuit()
*/
void *thread_do(void *arg)
{
pthread_mutex_t *mx = arg;
while(!needQuit(mx)) {}
return NULL;
}
int main(int argc, char *argv[])
{
pthread_t th;
pthread_mutex_t mxq; /* mutex used as quit flag */
/* init and lock the mutex before creating the thread. As long as the
mutex stays locked, the thread should keep running. A pointer to the
mutex is passed as the argument to the thread function. */
pthread_mutex_init(&mxq,NULL);
pthread_mutex_lock(&mxq);
pthread_create(&th,NULL,thread_do,&mxq);
sleep(2);
/* unlock mxq to tell the thread to terminate, then join the thread */
pthread_mutex_unlock(&mxq);
pthread_join(th,NULL);
sleep(2);
return 0;
}
: अंतिम विकल्प को लागू करने की
एक तरह से एक ध्वज के रूप में एक म्युटेक्स उपयोग करें, और pthread_mutex_trylock()
एक समारोह में लिपटे के साथ यह परीक्षण करने के लिए लूप परीक्षण में उपयोग करने के लिए है अलग (यह आमतौर पर डिफ़ॉल्ट रूप से नहीं है), आपको धागे को रोकने के बाद pthread_join()
पर कॉल करना चाहिए।यदि धागा अलग हो गया है, तो आपको इसमें शामिल होने की आवश्यकता नहीं है, लेकिन जब आप इसे समाप्त नहीं करते हैं तो आपको बिल्कुल पता नहीं चलेगा (या यहां तक कि लगभग, जब तक कि आप इसे बाहर निकलने के लिए कोई अन्य तरीका नहीं जोड़ते)।
pthreads को रद्द करना मतलब है कि थ्रेड को आवंटित किसी भी स्मृति को साफ़ करने का कोई मौका नहीं है। –
ठीक है मैंने इसे वैश्विक 'keepalive = 1' के द्वारा हल किया है। तब मैंने '1 (1)' से 'जबकि (रखरखाव)' बदल दिया। धागे को मारने के लिए अब मुझे परिवर्तनीय रखरखाव के मूल्य को 0 और वॉयला में बदलना होगा! – Pithikos