2013-09-27 102 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命名空間中註釋。