C語言中的localtime被多次使用引發的思考

  今天寫某個程式時,出現一個奇妙的問題,輸出的時間戳總是不正確,查了半天百思不得其解。我把出問題的代碼簡化成下面的形式:

輸出結果是:
debug1::20160818
debug2::20160729
debug3::20160729

  debug2和debug3的位置本想分別輸出目前的時間now和前推的時間las,而結果並沒有符合預想。看了看代碼,在前一次debug1輸出now,和後一次debug2輸出now之間,並沒有對結構體now做任何賦值操作,而now的內容卻改變成了和las一樣的。
  這個問題讓我百思不得其解,怎麼看我都沒有對now進行操作,唯一的解釋就是now和las指針指向的是同一個地址。最後不斷的測試縮小範圍,把問題鎖定到localtime()上。於是上網查詢了一下localtime()的文檔,發現localtime()不僅不是線程安全的函數,不建議使用,而且只能同時使用一次,因為localtime()不是可重入的。
  所以說我的now和las確實指向了同一個地址,因為我是在Linux下編譯的所以並沒有提示,如果在VS下編譯就會看見localtime()不是線程安全函數的提示。於是我從網上找到了libc提供的另一個函數localtime_r(),修改程序如下:

輸出結果是:
debug1::20160818
debug2::20160818
debug3::20160729

  於是問題解決了,還有要注意的是,Windows下並沒有localtime_r,與其相同的函數是localtime_s。

======
kujou_rin

1 關於 “C語言中的localtime被多次使用引發的思考” 的評論

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *