【1】线程的状态:默认为非绑定、非分离、1MB大小的堆栈(ubuntu 2.6的内核线程栈的默认大小为8M),与父进程具有同样的优先级
【2】等待线程——pthread_join
-
功能:阻塞等待,知道子线程结束运行,然后得到子线程退出码,回收子线程的资源。
-
如果不使用pthread_join回收线程,可能会导致类似僵尸进程一样的问题,导致内存泄漏。
【3】线程分离——pthread_detach
-
默认情况下,线程是非分离态(结合态)
-
如果不关心线程的退出时的状态,可以将之设置为分离态这种情况下,线程终止时能够自动清除资源
-
使用detach会让线程在后台运行
【4】多线程同步:
-
互斥锁
-
读写锁(
读写锁非常适合对数据读的次数比写的次数多。
三种状态:
1. 当资源加上了写锁之后,所有试图对资源加锁的线程都被阻塞;
2. 读模式加锁时,如果线程是读加锁则成功,如果线程是写加锁会阻塞。
3. 读锁、写锁并行阻塞时,写锁优先级高,即解锁后优先执行写锁操作
)
-
条件变量(互斥量是线程程序必需的工具,但并非是万能的。例如,如果线程正在等待共享数据内某个条件出现,那会发生什么呢?它可能重复对互斥对象锁定和解锁,每次都会检查C++共享数据结构,以查找某个值。但这是在浪费时间和资源,而且这种繁忙查询的效率非常低。)
-
信号量
-
屏障(
屏障允许任意线程等待,直到所有线程完成屏障前的处理工作,然后所有线程再开始屏障之后的工作;
比如pthread_join就是一种屏障,需要一个线程等待另一个线程终止
)
【5】线程并行方式
-
任务并行(把一个任务拆分成多个子任务,分工协作)
-
数据并行(比如大数处理的时候,可以使用数据并行,需要用到屏障进行同步)
【6】多线程模型
-
master - worker
-
fork - join(大数据处理比如)
-
生产者 - 消费者(lis比如)
-
future模型和actor模型不了解
https://www.cnblogs.com/PerkinsZhu/p/7570775.html
另一种解释:内核线程和用户线程之间的关系:
-
一对多(不支持多核CPU)
-
一对多
-
多对多