[Linux Multithreaded Programming - Selbststudienprotokoll] 05. Thread abbrechen

Linux-Multithread-Programmier-Lerncode (der Code wurde auf gitee hochgeladen, bitte klicken Sie auf Stern!)

https://gitee.com/chenshao777/linux_thread.git


Anmerkungen:
1. Die Cancel-Funktion
int pthread_cancel ( pthread_t tid )
bricht den durch tid angegebenen Thread ab und gibt erfolgreich 0 zurück.
Aber das Abbrechen sendet nur eine Anfrage, es bedeutet nicht, auf die Beendigung des Threads zu warten, und das erfolgreiche Senden bedeutet nicht, dass tid definitiv beendet wird

2. Abbruchstatus (Ignorieren oder Reagieren)
ist, wie der Thread das Abbruchsignal handhabt, Ignorieren oder Reagieren. "Standardantwort auf Abbruchsignal" bei der Thread-Erstellung

int pthread_setcancelstate(int state, int *oldstate)
setzt die Antwort dieses Threads auf das Cancel-Signal.Der Zustand hat zwei Werte:
PTHREAD_CANCEL_ENABLE (Standard) und PTHREAD_CANCEL_DISABLE,
die jeweils angeben, dass der Zustand nach Erhalt des Signals auf CANCLED gesetzt wird und die Das CANCEL-Signal wird ignoriert, um den Betrieb fortzusetzen;
Wenn old_state nicht NULL ist, wird es im ursprünglichen Cancel-Zustand zur Wiederherstellung gespeichert.

3. Der Abbruchtyp (sofortiger Abbruch oder verzögerter Abbruch)
ist die Antwort des Threads auf das Abbruchsignal, sofortiger Abbruch oder verzögerter Abbruch. "Standardmäßiger verzögerter Abbruch", wenn der Thread erstellt wird

int pthread_setcanceltype(int type, int *oldtype)
legt den Ausführungszeitpunkt der Abbruchaktion dieses Threads fest. type hat zwei Werte:
PTHREAD_CANCEL_DEFFERED und PTHREAD_CANCEL_ASYNCHRONOUS, die
nur gültig sind, wenn der Status von Cancel Enable ist,
bzw. anzeigen, dass sie weiter ausgeführt werden die nächste nach Empfang des Signals Cancel und dann beenden und sofort die Cancel-Aktion ausführen <exit>; wenn oldtype nicht NULL ist, wird es im importierten Wert des Cancel-Aktionstyps gespeichert.

4. Der Cancellation Point (man kann pThreads einsehen)
bricht einen Thread ab, was normalerweise die Mitarbeit des abgebrochenen Threads erfordert.
In vielen Fällen prüft der Thread, ob er eine Abbruchanforderung hat, und wenn ja, wird er aktiv beendet. Diese Orte, um zu prüfen, ob es einen Abbruch gibt, werden Abbruchpunkte genannt. Viele Orte enthalten Abbruchpunkte, einschließlich pthread_join()
,
pthread_testcancel (), pthread_cond_wait(), pthread_cond_timedwait (),
sem_wait()vsigwait(), schreiben, lesen, die meisten blockieren Systemaufrufe


spu.h-Datei

#ifndef _SPU_H_
#define _SPU_H_

#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>

#endif

thread_cancle.c-Datei

/*
  1.创建两个线程,线程2传入线程1的线程id
  2.线程的取消状态默认为 “响应”
  3.线程的取消类型默认为 ”延时相应“
  4.线程1中设置取消类型为 “立即相应”
  5.在线程2中取消线程1
*/

#include "spu.h"


void *thread_fun1(void *arg)
{
    
    
    //立即相应取消请求
    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
    for(int i = 0; i< 10; i++)
    {
    
    
        printf("thread01111 : %d\n", i);
        sleep(1);
    }
	return (void*)0;
}

void *thread_fun2(void *arg)
{
    
    
    for(int i = 10; i< 20; i++)
    {
    
    
        printf("thread02222 : %d\n", i);
        sleep(2);
        if(i == 12)
        {
    
    
            printf("取消线程1\n");
            if( 0 == pthread_cancel((pthread_t)arg))
                printf("取消线程1成功!\n");
        } 
    }
	return (void*)0;
}

int main(int argc, char *argv[])
{
    
    	
	int err1, err2;
	pthread_t thread_id1,thread_id2; 

    void *__retval;

	err1 = pthread_create(&thread_id1, NULL, thread_fun1, NULL);
    err2 = pthread_create(&thread_id2, NULL, thread_fun2, (void*)thread_id1);

	if(err1 || err2)
		printf("create failed!\n");
	else
		printf("create success!\n");


    pthread_exit(__retval);
}

おすすめ

転載: blog.csdn.net/HuangChen666/article/details/130457986