可重入函数与线程安全          

线程安全:

假如在一个函数中它是这么写的,在一个全局链表上存放数据,在单线程模式下,我们先new一个新的节点然后让head->next指向这个节点,这种场景在多线程场景下会是这样的过程,线程一new了一个节点,然后cpu转去执行线程二,线程二new一个节点后head->next指向线程二,然后执行线程一,线程一的head->next也指向它刚刚new出来的节点,这就导致一个head指向了两个节点,这也就是线程安全的问题。

导致线程安全问题需要满足下面两个条件:

1>:一定是发生在多个线程访问一个全局变量或者静态变量的场景下面。
2>:操作时非原子性的。

如何避免线程安全:

对访问全局或静态变量的语句前后加锁,这样就不会导致多个线程访问同一个资源的问题发生。

可重入函数:

可重入函数的概念很简单,就是这个函数是可以在任何时候都可以被打断,并且不会造成线程安全,由于在可重入函数中使用的都是线程自己的栈空间,变量是唯一的,不会造成访问同一个资源的问题,如果要在其种访问全局或静态变量还是要加上锁来避免冲突。

系统中有很些函数是不能用在可重入函数中的:例如malloc,new,还有一些I/O接口函数等。