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

标签 c multithreading stm32 iar localtime

我在多线程应用程序中使用本地时间。

我必须用一个线程安全的版本替换它,据我所知称为 localtime_r。

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

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

我的系统组件是:

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

我假设(虽然我不确定),这个函数通常会在随 IDE 一起提供的标准库中提供。我说得对吗?

我是否需要将另一个库添加到我的项目中,或者它是否在项目设置中?

如果没有可行的方法将此函数“导入”到我的代码中,我还有哪些其他选项可以用于本地时间函数的线程安全版本?

更新:

我希望避免使用 OS 资源(即互斥锁),而是调用一个标准例程,该例程与“本地时间”完全相同,只是没有它使用的静态结构(使其成为线程不安全的) .

我看不出 localtime 开始时会使用静态结构的任何原因,因此我假设相应的 localtime_r 不会使用任何操作系统资源来解决它,而只是避免使用静态结构。

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

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

谢谢

最佳答案

您需要为 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;
}

您需要在启动时的某处调用 my_localtime_init

这也意味着您需要用 my_localtime_r 函数替换所有调用,任何人都不能再直接调用 localtime(),因为这可能会导致与调用新 my_localtime_r 的代码发生竞争。

关于c - 标准 C 函数的线程安全版本 'localtime',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20820384/

相关文章:

c# - StructureMap 中的跨线程冲突

Java ServerSocket,如何每次接受2个连接?

python - ThreadPoolExecutor能否帮助单线程应用效率提升?

c - 堆栈粉碎检测到STM32f7

C - 代码块 - 设置程序参数

c - 大整数加法码

c - 将 "falign-functions"编译器标志显式设置为特定值的动机是什么?

c - 对 `__gmpz 和 makefile 的 undefined reference

c - 为什么stm32f4 uart使用中断接收时会跳过一些字符

c - 带按钮的 LED 灯闪烁