【问题标题】:Implement thread safe ctime function实现线程安全的ctime函数
【发布时间】:2013-10-03 14:07:49
【问题描述】:

ANSI C 时间函数不是线程安全的:尤其是gmtimectimestrftime。据我所知,唯一的线程安全函数是time

如果我在 Visual Studio 中是正确的,这个函数都是线程安全的。我正在使用 MinGW 编译器(带有 dwarf-2 的 4.8.0,由 Qt 5.1.0 提供)。

如何实现gmtime_rctime_rstrftime_r的线程安全功能?或者有没有更线程安全的库?

我使用 C++11 作为默认语言。

编辑 1
我在 windows xp 上使用 MinGW 4.8.0 (posix, dwarf-2)。

编辑 2
我正在考虑使用 Boost.DateTime 可能是一个不错的选择吗?

我对 c++11 缺乏时间管理感到非常失望!

【问题讨论】:

  • 我猜你没有可用的标准 POSIX 库,否则你已经有了ctime_r 等人。在 C++11 中,您拥有 std::chrono namespace
  • 我在 Windows Xp 上使用 MinGW。而且它不提供这个功能......所以我必须自己实现它。

标签: c++ multithreading c++11 time


【解决方案1】:

MinGW arleady 提供了 gmtime_r 和 gmtime_s 函数,但它们在 std 命名空间中的注释。

【讨论】:

    【解决方案2】:

    pthread.h 中实际上应该有 gmtime_rctime_r,但由于错误 (http://sourceforge.net/p/mingw/bugs/1625/),它们被暂时删除。

    你有几个选择

    1. 等待修复
    2. 使用旧版 MiniGW
    3. 使用lock_guard 为所有这些函数创建一个可重入包装器,就像safe_increment 所做的here
    4. 也许最好的方法是使用 C++11 添加的 chrono 头文件形式的函数

    【讨论】:

    • 不幸的是 std::chrono 不能满足我的要求:我需要一个 time_t 设置操作系统。时间(在 Windows 和 linux 中,SetSystemTimesettimeofdat)。旧版本的 MinGW 也无济于事。我正在使用所有最后的 c++11 功能
    • 我猜设置系统时间是很多“扩展”操作然后锁定所以尝试 std::lock_guard。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多