この質問があります:
pthread_cancel()
別のスレッドから(おそらく) スレッドを強制終了するにはどうすればよいですか?
これがサンプルコードです。1 を押すと、他のスレッドが強制終了される必要があります。(他のスレッドに a を入れずに、1 つのスレッドから kill を強制する必要がありpthread_exit()
ます。)
pthread_t THR_INPUT, THR_QUEUE;
void *thr_in(void *null) {
int opt;
while(1){
printf("1. Kill the other thread\n");
scanf("%d", &opt);
switch (opt)
{
case 1:
pthread_cancel(THR_QUEUE);
pthread_exit(NULL);
default:
printf("ATTENZIONE: Scelta %i non corretta. Riprovare.\n",opt);
}
}
}
void *thr_qu(int reparto) {
while(1){
sleep(2);
printf("I'm alive!");
}
}
int main(int argc, const char * argv[]){
void *result;
printf("-------start-------\nMenu:\n");
pthread_mutex_init(&mutex, NULL);
pthread_create(&THR_INPUT, NULL, thr_in, NULL);
pthread_create(&THR_QUEUE, NULL, thr_qu(reparto), NULL);
pthread_join(THR_INPUT, &result);
pthread_join(THR_QUEUE, &result);
printf("---end---\n");
exit(EXIT_SUCCESS);
}
解決策を考えていますが、それがどれほどクリーンかはわかりません。これを行うだけです:
int main(int argc, const char * argv[]){
void *result;
sem = semget(SEM_KEY, 0, 0);
pthread_mutex_init(&mutex, NULL);
int pid=getpid();
pid=fork();
if(!pid){
printf("-------START-------\nMenu:\n");
pthread_create(&THR_INPUT, NULL, thr_in, NULL);
pthread_create(&THR_QUEUE, NULL, thr_qu(reparto), NULL);
pthread_join(THR_INPUT, &result);
pthread_join(THR_QUEUE, &result);
}
else{
wait(sem,0);
pthread_cancel(THR_QUEUE);
printf("---END---\n");
}
exit(EXIT_SUCCESS);
}
そして、最初のスレッドにシグナルを入れ、終了するように求められたときに、メインスレッドのセマフォにシグナルを送信してpthread_cancel()
. しかし、それはまだ機能していません。理由はわかりません