多线程之线程控制--pthread_cancle

本文详细介绍了如何在嵌入式Linux系统中使用pthread_cancle进行线程控制,包括函数原型、线程属性设置、线程清理处理函数以及多种线程同步机制如互斥量、条件变量等的应用。通过对线程取消状态和类型的理解,实现更灵活的多线程管理。
摘要由CSDN通过智能技术生成

1.前言

同一进程创建多个线程以后,每个线程可以处理各自独立的任务。但有时,它们执行占用同一个资源,而且这个资源只能一次让一个线程占用。比如,后面将要用到的多线程实现SIM5360模块的打电话,上网,发短信同时使用一个串口,但串口只能给一个用。定义上网的优先级最低,也和我们平时使用手机的一样,当发送短信时,打断正在上网的线程。这就用到了线程控制的知识。

2.函数介绍

2.1函数原型
       #include <pthread.h>

       int pthread_cancel(pthread_t thread);

传入参数,创建线程时用pthread_t保存的线程标识-tid,成功返回0,否则返回错误编号。

2.2函数介绍

调用者调用函数并不是直接关掉相应的线程,而只是发起一个cancel请求,具体的决定权还是掌握在线程标识为tid的手上。还有很重要的一点是,调用者并不等待相应的线程终止。默认情况下,线程在取消请求发送以后还是继续执行。
我要弄死你毕竟是两个人的事,得看人家答应不答应,看完调用者,再看要被取消的线程。它还是继续执行,毕竟没动真格的,直到遇到相应的取消点,它在检查是否被取消,如果取消了则就按照请求行事。POSIX.1保证了调用一些函数后,取消点就会出现,这里就不在列出。大概就是一些会阻塞的函数,比如sleep,wait之类的。
线程能否被取消这是它的一个线程属性,线程的同步对象也有属性,比如什么进程共享属性,还有其他的什么互斥量属性,读写锁属性,条件变量属性,屏障属性。
对于线程的取消状态和取消类项并没有包含在线程属性的pthread_attr_t结构中。可以更改上面所说的行为。

3.属性设置函数


       int pthread_setcancelstate(int state, int *oldstate);
       int pthread_setcanceltype(int type, int *oldtype);

返回值成功为0;否则返回错误编号。
pthread_setcanceltype()设置能否被取消,PTHREAD_CANCEL_ENABLE可取消,默认PTHREAD_CANCEL_DISABLE。当为PTHREAD_CANCEL_DISABLE,pthread_cancle并不会杀死线程,这个请求对它来说处于挂起状态。
pthread_setcancelstate()设置什么时候被取消,是到下个取消点,还是直接退出。PTHREAD_CANCEL_ASYNCHRONOUS异步取消,任意时间取消。PTHREAD_CANCEL_DEFERRED推迟取消。

4.线程清理处理函数

线程可以安排退出时调用的函数,安排!安排!


       void pthread_cleanup_push(void (*routine)(void *),void *arg);
       void pthread_cleanup_pop(int execute);

处理程序记录在栈中,执行顺序与注册时相反。

5.线程同步

线程同步的方式有:

5.1互斥量

一把锁,同一时间只有一个线程可以访问数据

       int pthread_mutex_destroy(pthread_mutex_t *mutex);
       int pthread_mutex_init(pthread_mutex_t *restrict mutex,
              const pthread_mutexattr_t *restrict attr);
       pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
       
       int pthread_mutex_lock(pthread_mutex_t *mutex);
       int pthread_mutex_trylock(pthread_mutex_t *mutex);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值