我在多线程应用程序中使用localtime.
我必须用一个线程安全的版本替换它,据我所知,这个版本叫做localtime_r.
但是,当我这样做时,由于链接失败,我无法完成构建.
我甚至不确定从哪里开始寻找解决方案.
我的系统组件是:
芯片 - STM32(基于ARM的皮层)
IDE - IAR(ST-Microcontrollers的编译器和链接器)
操作系统 - ThreadX
我假设(虽然我不确定),这个函数通常会在随IDE提供的标准库中提供.我对么?
是否有我需要添加到项目中的其他库,还是项目设置中的某些内容?
如果没有可行的方法将此函数"导入"我的代码,我还有什么其他选项可用于本地时间函数的线程安全版本?
更新:
我希望避免使用OS资源(即互斥锁),而是调用一个标准例程,它正好执行'localtime'所做的事情,只是没有它使用的静态结构(使其不安全).
我没有看到为什么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的代码的竞争条件.