线程知识记录

1、线程概述

进程是资源管理的最小单位,线程是程序执行的最小单位,也被称为轻量级进程。

1.1、线程终止

如果需要只终止某个线程而不终止整个进程,可以有三种方法:
	1. 从线程函数return。这种方法对主线程不适用,从main函数return相当于调用exit。//线程return
	2. 一个线程可以调用pthread_cancel终止同一进程中的另一个线程。//被动终止
	3. 线程可以调用pthread_exit终止自己。//自己终止
	方式1和方式4的区别是,方式4可以返回一个结果指针,通过pthread_join可以获取,并且会启动资源释放。

	在任意一个时间点上,线程是可结合(joinable)或者是可分离的(detached)。一个可结合线程是可以被其他线程收回资源和杀死的。
在被回收之前,他的存储器资源(栈等)是不释放的。而对于detached状态的线程,其资源不能被别的线程收回和杀死,只有等到线程结束才能由系统自动释放。
	默认情况,线程状态被设置为结合的。所以为了避免资源泄漏等问题,一个线程应当是被显示的join或者detach的,否则线程的状态类似于进程中的Zombie Process。会有部分资源没有被回收的。
调用函数pthread_join,当等待线程没有终止时,主线程将处于阻塞状态。如果要避免阻塞,那么
在主线程中加入代码pthread_detach(thread_id)或者在被等待线程中加入pthread_detach(thread_self())。

1.2、线程属性

typedef struct
{
       int                               detachstate;   线程的分离状态
       int                               schedpolicy;  线程调度策略
       structsched_param              schedparam;  线程的调度参数
       int                               inheritsched;  线程的继承性
       int                                scope;       线程的作用域
       size_t                           guardsize;   线程栈末尾的警戒缓冲区大小
       int                                stackaddr_set;
       void*                          stackaddr;   线程栈的位置
       size_t                           stacksize;    线程栈的大小
}pthread_attr_t;		

1.3、线程优缺点

优:可以并发操作(对于多核或多CPU计算机来说,多线程可以最大发挥计算机能力。单核或单CPU的计算机来说,多线程其实是假的,是不停的切换调度模拟出来的)。
	相对于多进程,多线程之间数据共享效率更高。
缺:线程之间的数据同步略难搞,搞不好的话就会出现莫名其妙的问题。

1.4、线程权限

可由下图概括:
在这里插入图片描述

线程私有 线程之间共享(进程所有)
1、局部变量
2、函数参数
3、TLS数据
1、全局变量
2、堆上的数据
3、函数里的静态变量
4、程序代码(任何线程都有权利读取并执行任何代码)
5、打开的文件(A线程打开的文件可以由B线程读写)

2、线程函数

#include <pthread.h>
!!注:pthread并非Linux系统的默认库,在编译时注意加上-lpthread参数

	restrict:是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,
所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,
能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,
任何同样指向这个内存单元的其他指针都是无效指针。
函数名 参数说明 返回值 说明
int pthread_create(pthread_t *restrict tidp,
const pthread_attr_t *restrict attr,
void *(*start_rtn)(void),
void *restrict arg);
//返回线程的ID
//线程属性,默认为NULL使用默认属性
//线程函数入口地址
//线程函数参数,传入的是参数的地址,如果有多个参数就传结构体的地址。!!注:传栈地址的时候要小心
成功返回0 失败返回错误编号
pthread_t pthread_self(void); 返回调用
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值