2014-10-01 55 views
1

因爲在C中沒有靜態初始化,我想懶洋洋地初始化一個全局的mtx_t(請保持你的反應速度)。對我來說使用布爾標誌並不是什麼問題,但我寧願只檢查mtx_t變量。有沒有標準的mtx_t'invalid'狀態?

C11的mtx_t有一個幸運的'無效狀態'我可以檢查變量嗎?我在草案標準中找不到任何東西。

+0

我不認爲有一個。 C11線程沒有被廣泛實現,文檔也很差(在規範本身!)。所以如果你在規範中找不到任何東西,就是這樣。 – 2014-10-01 21:34:07

回答

3

不,沒有可以檢查的無效狀態,使用未初始化的mtx_t會導致未定義的行爲。

對於mtx_t而言,沒有靜態初始值設定項的整個事情有點愚蠢,在任何常規架構上都可以毫無問題地完成。 POSIX有它。

此外,很容易將足夠的狀態添加到mtx_t以使其成爲可能。你必須添加

  • 一個volatile int爲你當初始化完成
  • ,你作爲的情況下,自旋鎖的第一標誌是 0使用
  • 一個atomic_flag設置一個標誌。在這種情況下,一旦你持有自旋鎖
    • 測試的啓動標誌再次
    • 是否仍然0初始化mtx_t和啓動標誌設置爲一個
    • 取消設置atomic_flag
+0

這是一個非常明確的描述,說明如何實現雙重檢查鎖定 - volatile int標誌有一個數據競爭。 – Casey 2014-10-02 06:24:15