मैं भी आपके थ्रेड को समाप्त करने के लिए चुनिंदा या कुछ अन्य गैर सिग्नल-आधारित माध्यमों का उपयोग करने की अनुशंसा करता हूं। धागे के कारणों में से एक कारण सिग्नल पागलपन से कोशिश करना और दूर जाना है। यही कारण है कि ने कहा ...
आम तौर पर एक SIGUSR1 या SIGUSR2 साथ pthread_kill() का उपयोग करता है धागा के लिए एक संकेत भेजने के लिए। अन्य सुझाए गए संकेत - सिगरम, सिगिनट, सिगकिल - में प्रक्रिया-व्यापी अर्थशास्त्र है जिसमें आपको कोई दिलचस्पी नहीं हो सकती है।
जब आप सिग्नल भेजते हैं तो व्यवहार के लिए, मेरा अनुमान है कि इसे कैसे करना है आपने संकेत संभाला। यदि आपके पास कोई हैंडलर इंस्टॉल नहीं है, तो उस सिग्नल की डिफ़ॉल्ट क्रिया लागू होती है, लेकिन सिग्नल प्राप्त करने वाले थ्रेड के संदर्भ में। इसलिए, उदाहरण के लिए, SIGALRM को आपके थ्रेड द्वारा "संभाला" जाएगा, लेकिन हैंडलिंग में प्रक्रिया को समाप्त करना होगा - शायद वांछित व्यवहार नहीं। धागा द्वारा एक संकेत के
रसीद आम तौर पर एक पढ़ने से बाहर टूट जाएगा EINTR साथ जब तक यह है कि अबाधित राज्य में सही मायने में है के रूप में पहले के एक जवाब में बताया गया। लेकिन मुझे लगता है कि यह नहीं है, या SIGALRM और SIGIO के साथ आपके प्रयोगों ने प्रक्रिया को समाप्त नहीं किया होगा।
क्या आपका शायद कुछ प्रकार के लूप में पढ़ा जाता है? यदि रीड -1 रिटर्न के साथ समाप्त हो जाता है, तो उस लूप से बाहर निकलें और थ्रेड से बाहर निकलें।
आप यह बहुत ही खराब कोड मैं एक साथ रखा मेरी मान्यताओं का परीक्षण करने के साथ खेल सकते हैं - मैं समय-क्षेत्र इस समय मेरी POSIX किताबों से दूर के एक जोड़े हूँ ...
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <signal.h>
int global_gotsig = 0;
void *gotsig(int sig, siginfo_t *info, void *ucontext)
{
global_gotsig++;
return NULL;
}
void *reader(void *arg)
{
char buf[32];
int i;
int hdlsig = (int)arg;
struct sigaction sa;
sa.sa_handler = NULL;
sa.sa_sigaction = gotsig;
sa.sa_flags = SA_SIGINFO;
sigemptyset(&sa.sa_mask);
if (sigaction(hdlsig, &sa, NULL) < 0) {
perror("sigaction");
return (void *)-1;
}
i = read(fileno(stdin), buf, 32);
if (i < 0) {
perror("read");
} else {
printf("Read %d bytes\n", i);
}
return (void *)i;
}
main(int argc, char **argv)
{
pthread_t tid1;
void *ret;
int i;
int sig = SIGUSR1;
if (argc == 2) sig = atoi(argv[1]);
printf("Using sig %d\n", sig);
if (pthread_create(&tid1, NULL, reader, (void *)sig)) {
perror("pthread_create");
exit(1);
}
sleep(5);
printf("killing thread\n");
pthread_kill(tid1, sig);
i = pthread_join(tid1, &ret);
if (i < 0)
perror("pthread_join");
else
printf("thread returned %ld\n", (long)ret);
printf("Got sig? %d\n", global_gotsig);
}
QQQ पुस्तकालयों द्वारा रुचि हो सकती है सही जवाब है, जो दुर्भाग्य से बहुत कम वोट है दिखा रहा है। 'pthread_cancel' आपकी समस्या का समाधान है। –
जब तक धागा अवरुद्ध रहता है, तब तक यह कोई नुकसान नहीं पहुंचा सकता है। मुद्दा यह है कि जब आप चीजों को बंद कर रहे हों तो थ्रेड उठता है। तो फिक्स लाइन के बाद कुछ कोड डालना है जो थ्रेड को थ्रेड को किसी भी चीज़ से रोकता है * अन्य * अगर शटडाउन प्रगति पर है। –
एक समान समस्या और संभावित समाधानों पर चर्चा की गई है: [फाइल डिस्क्रिप्टर और बहुप्रचारित कार्यक्रम] (http://www.ddj.com/hpc-high-performance-computing/212001285) – dmityugov