计算机系统里,先有了进程,然后有了线程。

    使用线程的好处有两点:

1、避免进程阻塞;

2、提升资源利用率,提升效率。

    但是根据上一篇讲述的进程和线程,使用线程是有风险的。

    进程有分配给自己的地址空间,它有三部分组成,存放处理器执行所需代码的文本空间(text region)、变量和运行所需内存的数据空间(data region)、存放指令和本地变量的堆栈(stack region)。

    而线程是没有自己的资源的,进程下的所有线程共享进程的资源,其中就包括了进程的地址空间。

    那么,假如多个线程都访问一个全局变量并对其进行修改,那就出现了污染数据的风险。

    这个就叫做线程不安全。

    如果一个函数能够安全地同时被多个线程调用而得到正确的结果,那么,我们说这个函数是线程安全的。所谓“安全”,一切可能导致结果不正确的因素都是不安全的调用。

    线程安全,是针对多线程而言的。与可重入联系起来,我们可以断定:可重入函数必定是线程安全的,但线程安全的不一定是可重入的。不可重入函数,函数调用结果不具有可再现性,可以通过互斥锁等机制使之能安全地同时被多个线程调用,那么,这个不可重入函数就是转换成了线程安全。

可重入函数的特点如下:

①不为连续的调用持有静态数据; 

②不返回指向静态数据的指针;所有数据都由函数的调用者提供; 

③使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据; 

④如果必须访问全局变量,记住利用互斥信号量来保护全局变量; 

⑤绝不调用任何不可重入函数。

 

不过,可重入函数又会引入一个新的风险:死锁。

浅谈死锁见下一篇。