线程按照其调度者可以分为用户级线程和核心级线程两种
用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定,在运行时不需要特定的内核支持;
我们常用基本就是用户级线程,所以就只总结一下POSIX提供的用户级线程接口;
基本线程操作相关的函数:
1线程的建立结束
2线程的互斥和同步
3使用信号量控制线程
4线程的基本属性配置
基本线程操作:
例程中循环3次建立3条线程,并且使用pthread_join函数依次等待线程结束;
线程中使用rand()获取随机值随机休眠5次,随意会出现后执行的线程先执行完成;
运行结果:
可以看到,线程1先于线程0执行,但是pthread_join的调用时间顺序,先等待线程0执行;
由于线程1已经早结束,所以线程0被pthread_join等到的时候,线程1已结束,就在等待到线程1时,直接返回;
在上面的程序中增加互斥锁
在上面的例程中直接添加同步锁pthread_mutex_t;
在线程中加入,于是程序在执行线程程序时;
调用pthread_mutex_lock上锁,发现上锁时候后进入等待,等待锁再次释放后重新上锁;
所以线程程序加载到队列中等待,等待成功上锁后继续执行程序代码;
运行结果
跟例程1中执行结果不同,线程程序被加载到队列中而不能马上执行,需要等到能够成功上锁;
上锁后,继续执行线程程序,上锁执行;
这样线程被依次执行的情况在实际使用场景中经常出现;
使用场景:
当用户登录后获取秘钥才能继续获取该用户的基本信息时;需要等待登录线程结束后才能继续执行获取用户信息的线程时,
需要调用两条线程,假如是:threadLogin(),threadGetInfo(); 则可以有2种方法实现:
1 此时可以使用互斥锁同时一次性调用完threadLogin()和threadGetInfo();
2 当然也可以不使用互斥锁直接在threadLogin()中登录验证成功后调用threadGetInfo();
相比之下,方式1更加清晰的显示逻辑关系,增加代码可读性可扩展性。
执行结果,仍然是建立3条线程,每条线程执行时休眠随机时长:
设置属性一般有:
1 绑定属性
2 分离属性
3 堆栈地址
4 堆栈大小
5 优先级
在运行前后使用 $ free 命令查看内存前后的使用情况发现:
在线程结束后内存马上被释放;
其实,一般线程的属性直接使用系统默认属性即可;
关于线程的使用,大约就是这样。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/3946.html