线程安全:
如果一个函数被多个并发线程同时调用时,它仍然能产生正确的结果,那么这个函数就是线程安全的。
要确保线程安全,关键是线程之间的共享变量的访问。如果多个线程之间访问了相同的共享变量,这个时候如果没有加任何安全措施,就很有可能出现错误。比如各个属于同一进程的线程访问全局变量时,很有可能会得到错误的结果。若要确保线程安全那就可以通过加锁的方式。
可重入函数:
关于可重入没有确切的解释,不过可以这样理解:如果执行流执行到foo()函数,这个时候来了一个信号,程序就会转而去处理信号处理函数,信号处理函数在执行过程中又调用了foo()函数,这个时候就发生了重入。如果这个时候两个foo()依然能正确运行,那么foo()就是可重入的。
可重入函数是线程安全的一种,或者说是线程安全函数的子集。多个线程或执行流进入可重入函数时,该函数没有访问全局或静态变量,依然能产生正确结果。
可重入函数分为显式可重入和隐式可重入:
显式可重入函数:如果函数的参数是传值方式,并且只访问本地对象,没有访问全局对象,它就是显式可重入函数;
隐式可重入函数:如果函数的参数是传引用(指针)方式,但是引用(指针)指向的是非共享变量,函数内部也没有访问全局或静态变量,它就是隐式可重入函数。
简单理解就是可重入函数没有访问全局或静态变量,因此不会产生一些竞态结果。
1.如果一个函数访问了全局或静态变量,则它既不是线程安全函数也不是可重入函数;
2.在第一步基础上,通过加锁的方式能使该函数成为线程安全的函数,但不一定是可重入函数。加锁适用于多线程访问情况,一个线程内部可能会出错;
3.如果把访问全局或静态变量改成传参或其他方式,则有可能是该函数变成可重入函数。