标准C函数'localtime'的线程安全版本

bar*_*nos 2 c multithreading stm32 localtime iar

我在多线程应用程序中使用localtime.

我必须用一个线程安全的版本替换它,据我所知,这个版本叫做localtime_r.

但是,当我这样做时,由于链接失败,我无法完成构建.

我甚至不确定从哪里开始寻找解决方案.

我的系统组件是:

  • 芯片 - STM32(基于ARM的皮层)
  • IDE - IAR(ST-Microcontrollers的编译器和链接器)
  • 操作系统 - ThreadX

我假设(虽然我不确定),这个函数通常会在随IDE提供的标准库中提供.我对么?

是否有我需要添加到项目中的其他库,还是项目设置中的某些内容?

如果没有可行的方法将此函数"导入"我的代码,我还有什么其他选项可用于本地时间函数的线程安全版本?

更新:

我希望避免使用OS资源(即互斥锁),而是调用一个标准例程,它正好执行'localtime'所做的事情,只是没有它使用的静态结构(使其不安全).

我没有看到为什么localtime会使用静态结构开始的任何原因,所以我假设相应的localtime_r并没有解决任何操作系统资源,而只是避免使用静态结构.

如果没有这样的选择是可行的,那么我不妨自己实现它,只是因为约会系统的"不规则性",我更喜欢使用已经过适当测试的东西.

这里的问题是,如何将localtime_r'链接到我的项目中(而不是如何实现localtime_r).

谢谢

nos*_*nos 5

您需要为localtime()创建自己的线程安全包装器,它基本上是实现localtime_r().

例如

static TX_MUTEX localtime_lock;
void my_localtime_init(void)
{
  tx_Mutex_create( &localtime_lock, "localtime_lock", TX_INHERIT);
}

struct tm *my_localtime_r(const time_t *tim, struct tm *result)
{
   struct tm *t;

   tx_Mutex_get(&localtime_lock, TX_WAIT_FOREVER);
   t = localtime(tim);
   if (t)
       *result = *t;
   tx_Mutex_put(&localtime_lock);

  return t ? result : NULL;
}
Run Code Online (Sandbox Code Playgroud)

你需要my_localtime_init在启动时调用某个地方.

这也意味着你需要用my_localtime_r函数替换所有的调用,没有人可以直接调用localtime(),因为这可能导致调用新my_localtime_r的代码的竞争条件.

  • 但是代码不应该是调用`localtime()`,如果它是线程的 - 因为`localtime()`首先不是线程安全的.顺便说一下,如果`localtime()`返回一个空指针,你可能会崩溃. (2认同)