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

 紫褚1314 发布于 2023-02-07 17:26

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

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

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

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

我的系统组件是:

芯片 - STM32(基于ARM的皮层)

IDE - IAR(ST-Microcontrollers的编译器和链接器)

操作系统 - ThreadX

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

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

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

更新:

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

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

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

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

谢谢

1 个回答
  • 您需要为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的代码的竞争条件.

    2023-02-07 17:29 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有