c++ - localtime 不是线程安全的,但是可以只调用一个线程吗?

标签 c++ linux multithreading

正在将另一个用户代码集成到我的代码中。他们有调用非线程安全的本地时间函数的库。

我注意到了一些奇怪的问题。如果他们的代码仅限于一个线程,localtime 仍然会导致问题吗?请注意,在我的代码的其他线程中,我调用了 localtime_r(线程安全版本)。

谢谢。

最佳答案

原因localtime不是线程安全的是它将结果( struct tm * )存储在静态变量中。所以只要你只从一个线程调用这个函数,它就不会引起问题。

换句话说,localtime看起来像这样:

struct tm *localtime(time_t *timer)
{
   static struct tm tt;
   ... many lines that sets tt member variables ... 
   return &tt;
}

显然,如果两个线程调用此函数,则返回指针中的值将根据上次调用的线程“随机”更改 localtime() timer 中的值是多少?是。

函数localtime_r是安全的,因为它需要 struct tm *作为参数,并返回指向该变量的指针。而事实上,以上就是如何localtime用于实现。所以,如果代码为 localtime_r看起来有点像这样:

struct tm *localtime_r(time_t *timer, struct tm *result)
{
   ... many lines that sets result member variables ... 
   return result;
}

现在,当然,我们可以制作一个更短的 localtime 版本:

struct tm *localtime(time_t *timer)
{
   static struct tm tt;
   return localtime_r(timer, &tt); 
}

Edit2:result 当然是至关重要的localtime_r 的参数对于调用它的线程是唯一的。有一个 static或此参数的全局变量将使它与以前的问题非常相似。

Edit3:当然还有另一种方法让它出错:

struct tm *a, *b;
... 
a = localtime(something);
... 
b = localtime(someother);

if (a->tm_sec != b->tm_sec) 
{
   ... this never happens ... 
}

在这种情况下,ab将指向完全相同的位置。如果相同的变量用于 localtime_r,则同样适用并且使用不同的指针来接收数据,并且期望指针指向不同的事物。

关于c++ - localtime 不是线程安全的,但是可以只调用一个线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16575029/

相关文章:

c# - 提高 C# 代码的性能

c++ - 如何在编译时检查两种类型是否相同(如果它与 Boost strong typedef 一起使用则加分)

c++ - 获取数组指针模板参数的大小

c++ - wxWidgets 在其他机器上运行

linux - 使用 bash 命令将文件从子文件夹复制到另一个

找不到 php 命令

java - 如何让我的程序等待特定线程并且不影响我的 GUI 的交互性?

java - 安卓NDK : Calling Java functions from C++

linux - 脚本如果 ls -lrtd 返回文件或目录不存在该怎么办

c# - 当没有更多可用线程时 .ForEach 循环是否阻塞