pthread_cancel 相关

Posted Hello World

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pthread_cancel 相关相关的知识,希望对你有一定的参考价值。

假设线程A对线程B发出了一个取消请求。通过如下函数:

#include <pthread.h>
int pthread_cancel(pthread_t thread); 

参数: 
thread - 收到取消请求的线程id 

返回值: 
发送终止信号给thread线程,如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。

 线程B如何反应呢?

这取决线程的两个状态属性,它们决定了该线程收到取消请求时的行为,下面给出这两个字段的意义和用法。

(1)线程的cancelability state

字段可以取值为:enabled (默认) or disabled。当取值为enabled,由cancelability type属性决定线程的行为。当取值为disabled,线程不可被取消,但取消请求还是会被接受。

#include <pthread.h>
int pthread_setcancelstate(int state, int *oldstate);

参数:
state - 设置线程的取消state,可以取如下值
PTHREAD_CANCEL_ENABLE(默认取值)
PTHREAD_CANCEL_DISABLE

oldstate - 用作保存线程之前的取消state

(2)线程的cancelability type 

#include <pthread.h>
int pthread_setcanceltype(int type, int *oldtype);

参数:
type - 取值如下
PTHREAD_CANCEL_DEFERRED(默认取值)
取消请求会被推迟到调用一个是cancellation point的函数,参看http://man7.org/linux/man-pages/man7/pthreads.7.html

PTHREAD_CANCEL_ASYNCHRONOUS
线程可以在任何时候被取消。(通常,线程只要接收到取消请求,便会直接被取消。但是系统不保证这一点)。

oldtype - 保存旧的type

 

 一个例子

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>

void wait() {
        for(int i = 0; i < 10000; i++){
                for (int j = 0; j < 1000; j++){
                        int k = 4;
                }
        }
}

void* PrintHello(void* threadid) {
        wait();//延时,等待足够时间以至于能够使得这个线程接收到取消请求。不用sleep函数是因为,这里需要测试pthread_testcancel函数是否是取消点,然而sleep也是取消点

        pthread_testcancel();//

        printf("hi\n"); //这一行不会被打印

        pthread_exit(NULL);
}

int main(){
        pthread_t tid;
        pthread_create(&tid, NULL, PrintHello, NULL);
        pthread_cancel(tid);//对tid对应的线程发送一个取消请求

        pthread_exit(NULL);
        return 0;
}

 

1.需要的头文件

#include <pthread.h>

2.编译指令

gcc main.c -lpthread

3.相关概念

http://man7.org/linux/man-pages/man3/pthread_setcancelstate.3.html

以上是关于pthread_cancel 相关的主要内容,如果未能解决你的问题,请参考以下文章

线程取消(pthread_cancel)

线程取消(pthread_cancel)

使用 pthread_cancel 引入的死锁问题

线程取消(pthread_cancel)

线程取消(pthread_cancel)

线程取消(pthread_cancel)