Fork me on GitHub

[程序员的自我修养--链接、装载与库]笔记(一)

回顾

pic
pic

线程的访问权限

pic

线程调度

pic
pic
线程调度大多从优先级调度轮转法2个方面设计策略
在Linux下与线程相关的操作可以通过pthread库来实现,相关参考1
IO密集型线程: 频繁等待的线程
CPU密集型线程: 很少等待的线程
IO密集型线程比cpu密集型线程容易得到优先级的提升
pic

Linux下的多线程

pic
pic
pic

线程安全

同步与锁

pic
pic
pic
注意二元信号量多元信号量

信号量互斥量临界区读写锁条件变量

pic
pic
pic
pic

可重入函数是线程安全的

可重入函数满足条件:
(1)不使用全局变量或静态变量;
(2)不使用用malloc或者new开辟出的空间;
(3)不调用不可重入函数;
(4)不返回静态或全局数据,所有数据都有函数的调用者提供;
(5)使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据;

不可重入函数符合以下条件之一
(1)调用了malloc/free函数,因为malloc函数是用全局链表来管理堆的。
(2)调用了标准I/O库函数,标准I/O库的很多实现都以不可重入的方式使用全局数据结构。
(3)可重入体内使用了静态的数据结构。

可重入函数与线程安全的区别与联系

联系:
函数可以是可重入的,是线程安全的,或者二者皆是,或者二者皆非。不可重入的函数不能由多个线程使用。另外,或许不可能让某个不可重入的函数是线程安全的。

区别:
(1)可重入函数是线程安全函数的一种,其特点在于它们被多个线程调用时,不会引用任何共享数据。
(2)线程安全是在多个线程情况下引发的,而可重入函数可以在只有一个线程的情况下来说。
(3)线程安全不一定是可重入的,而可重入函数则一定是线程安全的。
(4)如果一个函数中有全局变量,那么这个函数既不是线程安全也不是可重入的。
(5)如果将对临界资源的访问加上锁,则这个函数是线程安全的,但如果这个重入函数若锁还未释放则会产生死锁,因此是不可重入的。
(6)线程安全函数能够使不同的线程访问同一块地址空间,而可重入函数要求不同的执行流对数据的操作互不影响使结果是相同的。

过度优化

pic
pic

3种线程模型

1对1模型

pic
pic
pic

多对1模型

pic

多对多模型

pic
pic

------ Happy Ending Meet The Better You ------