当前位置: 首页 > article >正文

【Linux多线程编程-自学记录】05.取消线程

Linux多线程编程学习代码(代码已上传gitee,还请各位兄弟点个Star哦!)

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


笔记:
1.取消函数
int pthread_cancel ( pthread_t tid )
取消tid指定的线程,成功返回0。
但是取消只是发送一个请求,并不意味着等待线程终止,而且发送成功也不意味着tid一定会终止

2.取消状态(忽略或者响应)
就是线程对取消信号的处理方式,忽略或者响应。线程创建时 “默认响应取消信号”

int pthread_setcancelstate(int state, int *oldstate)
设置本线程对Cancel信号的反应,state有两种值:
PTHREAD_CANCEL_ENABLE(缺省)和PTHREAD_CANCEL_DISABLE,
分别表示收到信号后设为CANCLED状态和忽略CANCEL信号继续运行﹔
old_state如果不为NULL则存入原来的Cancel状态以便恢复。

3.取消类型(立即取消或者延时取消)
是线程对取消信号的响应方式,立即取消或者延时取消。线程创建时 “默认延时取消”

int pthread_setcanceltype(int type, int *oldtype)
设置本线程取消动作的执行时机,type由两种取值:
PTHREAD_CANCEL_DEFFERED和PTHREAD_CANCEL_ASYNCHRONOUS,
仅当Cancel状态为Enable时有效,
分别表示收到信号后继续运行至下一个取消点再退出和立即执行取消动作〈退出〉﹔ oldtype如果不为NULL则存入运来的取消动作类型值。

4.取消点(man pthreads可以查看)
取消一个线程,它通常需要被取消线程的配合。
线程在很多时候会查看自己是否有取消请求如果有就主动退出,这些查看是否有取消的地方称为取消点
很多地方都是包含取消点,包括
pthread_join()、pthread_testcancel()、pthread_cond_wait()、pthread_cond_timedwait() 、
sem_wait()vsigwait() 、 write 、 read, 大多数会阻塞的系统调用


spu.h文件

#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文件

/*
  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);
}

http://www.kler.cn/a/16418.html

相关文章:

  • Prometheus面试内容整理-Exporters
  • 【缺陷检测】Anomaly Detection via Reverse Distillation from One-Class Embedding
  • 机器学习总结
  • UniApp 应用、页面与组件的生命周期详解
  • 【计算机网络】UDP网络程序
  • 21. Drag-Drop拖放操作(二) - 文件、表格和树的拖放实现
  • Tomcat8和Tomcat9乱码问题
  • 浪潮之巅 OpenAI有可能是历史上第一个10万亿美元的公司
  • 一篇带你了解大厂都在用的DDD领域驱动设计
  • 【Canvas入门】从零开始在Canvas上绘制简单的动画
  • 高性能定时器介绍及代码逐行解析--时间堆
  • 走进小程序【十一】微信小程序【使用Echarts 和 腾讯地图】
  • R语言 | 数据框
  • MySQL数据库——MySQL修改视图(ALTER VIEW)
  • vim 常用操作(vimtutor阅读笔记)
  • 移动宽带安装说明一(刘欣)
  • 【第十一届泰迪杯B题】产品订单的数据分析与需求预测
  • Netty小白入门教程
  • tensorflow中Keras ---图像预处理----tf.keras.preprocessing.image.ImageDataGenerator 类
  • P1915 [NOI2010] 成长快乐
  • 三元操作 三元操作符 if-else / ? :
  • 进程控制下篇
  • [LeetCode]1033. 移动石子直到连续
  • 《基于光电容积法和机器学习的冠状动脉疾病患者出血风险预测》阅读笔记
  • 【Python2.x与Python3.x的区别】
  • 进程相关(创建-回收-exec-守护进程)