应用程序开发第六天多线程(国嵌)

嵌入式Linux 专栏收录该内容
56 篇文章 0 订阅
多线程
1.线程基础
有了进程为什么还要引入线程
多线程属于同一个进程

遵循POSIX。使用pthread.h,连接时需要使用libpthread.a库
2.线程
1.创建线程
#include<pthread.h>
int pthread_create(tidp,attr,start_rtn,arg);
tidp:线程id(用于返回的)。attr:线程属性(通常为空)。start_rtn:线程要执行的函数,是一个函数指针,返回一个void *(需要确认???进行查询确认)。arg:start_rtn的参数
与fork区别去执行指定的函数,指定函数执行完成,此线程结束
2.编译
因为pthread的库不是Linux系统的库,所以在进行编译的时候要加上 -lpthread
gcc filename -lpthread

3.实例
如何传递整型参数
thread_int.c
如何传递string型参数
thread_string.c
如何传递struct型参数
thread_struct.c
变量的使用顺序:线程先使用数据段 全局变量在数据段,临时变量在栈
thread_share.c
4.线程的终止
如果进程中任何一个线程中调用exit或_exit那么整个进程都会终止。线程的常用退出方式有:
1.线程从启动例程中返回
2.线程可以被另一个进程终止
3.线程自己调用pthread_exit函数
void pthread_exit(void* rval_ptr)
rval_ptr:线程退出返回的指针
5.线程等待
int pthread_join(pthread_t tid,void **rval_ptr)
功能:阻塞调用线程,直到指定的线程终止。
tid:等待退出的线程id
rval_ptr:线程退出的返回值指针


进程退出他创建的线程就结束了
6.线程标识
pthread_t pthread_self(void)
功能:获取调用线程的thread identifier.返回当前线程的id
在线程中使用getpid()获取的是创建该线程的进程。也说明了线程是受进程管辖的
7.清除
终止有两种情况:正常和非正常
正常:线程调用pthread_exit.线程return返回(可预见)
非正常:在其他线程干预下或由于自身运行错误退出(不可预见)

资源释放:终止同存在资源释放的问题

从pthread_cleanup_push的调用点到pthread_cleanup_pop之间的程序段中的终止动作(包括调用pthread_exit和异常终止,但是不包括return)都将执行pthread_cleanup_push所指定的清理函数
把认为有必要有可能出现错误的代码保护起来,若异常退出,在退出前执行

void pthread_cleanup_push(rtn,arg)
rtn:清除函数
arg:清除函数的参数 
发生异常:在异常终止前或pthread_exit调用rtn函数
不发生异常:正常执行
void pthread_cleanup_pop(int execute)
功能:将清除函数弹出清除栈
参数:execute执行到pthread_cleanup_pop()时是否在弹出清理函数的同时执行该函数,非0:执行,0:不执行
执行到pop通过execute来决定清除函数是否执行
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页

打赏作者

G1036583997

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值