int g_var = 1;
int f()
{
g_var = g_var + 2;
return g_var;
}
int g()
{
return f() + 2;
}
维基上是这么说的:
以上代码中,f
使用了全局变量 g_var,所以,如果两个线程同时执行它并访问g_var
,则返回的结果取决于执行的时间。因此,f
不可重入。而g
调用了f
,所以它也不可重入。
但是,维基上又说:与多线程并发执行的线程安全不同,可重入强调对单个线程执行时重新进入同一个子程序仍然是安全的。
- 可重入是在单线程操作系统背景下,重入的函数或者子程序,按照后进先出的线性序依次执行完毕。
- 多线程执行的函数或子程序,各个线程的执行时机是由操作系统调度,不可预期的,但是该函数的每个执行线程都会不时的获得CPU的时间片,不断向前推进执行进度。
按这样说的话,那“如果两个线程同时执行它并访问g_var
,则返回的结果取决于执行的时间。”这句话想表示的应该是 f 和 g 两个函数不是线程安全的啊,因为它说的是两个线程啊,可重入不可重入不是针对一个线程而言的吗?为什么说这两个函数是不可重入的呢?