请问如下代码到底是线程不安全还是不可重入呢

 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 两个函数不是线程安全的啊,因为它说的是两个线程啊,可重入不可重入不是针对一个线程而言的吗?为什么说这两个函数是不可重入的呢?

它的意思应该是如果这两个函数在不同的线程中,这两个函数是不可重入的。

前提是,函数在不同的线程中

多线程的时候要加锁。