2013-09-27 69 views
3

ANSI C时间函数不是线程安全的:特别是gmtime,ctimestrftime。据我所知,唯一的线程安全函数是time执行线程安全ctime函数

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

如何实现线程安全功能gmtime_r,ctime_rstrftime_r?还是有更多的线程安全库?

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

在Windows XP上编辑1
我使用MinGW的4.8.0(POSIX,矮2)。

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

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

+0

我猜你没有可用的标准POSIX库,否则你已经有['ctime_r'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/ctime.html)等人。而在C++ 11中,你有['std :: chrono'命名空间](http://en.cppreference.com/w/cpp/chrono)。 –

+0

我在Windows XP上使用MinGW。它不提供这个功能...所以我必须自己实现它。 –

回答

2

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

你有几种选择

  1. 等待,直到它会被固定
  2. 使用MiniGW
  3. 让所有的使用lock_guard就像safe_increment这些功能折返包装旧版本做了here
  4. 也许最好的方法是使用函数形式chrono由C++添加的头文件11
+0

不幸的'std :: chrono'不能满足我的要求:我需要一个time_t来设置O.S.时间(在Windows和Linux中都使用'SetSystemTime'和'settimeofdat')。而MinGW的老版本并没有帮助。我使用所有最后的c + + 11功能 –

+0

我猜测设置系统时间是非常“广泛”的操作,然后锁定,所以尝试std :: lock_guard。 – tomas789

0

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