可重入函数
可重入函数简单也就相当于可以被中断的函数,即一个函数正在执行的过程中被其他函数或操作中断出去,在这个中断操作执行完毕后,再返回来执行原代码。
那么如果这个中断出去的函数对i进行操作呢?
假设这个中断函数对i直接进行加9,那么在中断函数返回之后i=9,sum只进行一次+=操作,但是原先的预期是从0+到9,所以跟我们的预期结果有很大的差异。
所以对于可重入函数要进行对于全局属性的变量的保护。而不至于会出现这种类似中断操作进行打断的操作。
线程安全
线程安全就是在多线程服务时,多个线程可能会访问同一块数据,则操作系统对这块邻界资源进行保护,这个在我之前的博客里面有详细说明。线程安全就是对邻界资源进行保护,线程不安全就是对邻界资源不进行保护。
判断线程是否安全
如果代码所在的进程中有多个线程在运行这个代码,而每次多线程下运行的结果和单线程运行下相同,则证明你的代码线程是安全的。
线程安全问题都是由全局变量及静态变量引起的。
如果说有一个多线程的进程存在多个全局变量和静态变量,那么对这两种变量进行只读操作时,是断然不会出现线程安全事故的。
只有在对这两种变量进行写,而系统又对这个“全局变量或静态变量”的“邻界资源”没有进行保护,那么绝对会出现线程安全问题。
之前提到的二元信号量其实就是对邻界资源的一种保护方式:
未进行保护之前:
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t id=fork();
if(id<0)
{
perror("fork");
return -1;
}
if(id==0)
{
while(1)
{
printf("A");
fflush(stdout);
//sleep(1);
printf("A");
fflush(stdout);
//sleep(1);
}
}
else
{
while(