/Zc:threadSafeInit (安全執行緒區域靜態變數初始設定)

/Zc:thread保管庫Init 編譯器選項會指示編譯器以安全線程的方式初始化靜態本機 (函式範圍) 變數,而不需要手動同步處理。 只有初始化是安全線程。 多個執行緒仍必須手動同步處理靜態區域變數的使用和修改。 此選項可從 Visual Studio 2015 開始提供。 根據預設,Visual Studio 會啟用此選項。

語法

/Zc:thread保管庫Init [ - ]

備註

在 C++11 標準中,具有靜態或執行緒儲存持續時間的區塊範圍變數必須在進行任何其他初始化之前,以零初始化。 當控制項第一次通過變數的宣告時,就會進行初始化。 如果在初始化期間擲回例外狀況,變數會被視為未初始化,且下次控制項通過宣告時會重新嘗試初始化。 如果控制項在初始化的同時輸入宣告,則初始化完成時並存執行區塊。 如果控制項在初始化期間以遞迴方式重新輸入宣告,則行為是未定義的。 根據預設,從 Visual Studio 2015 開始的 Visual Studio 會實作此標準行為。 設定 /Zc:thread保管庫Init 編譯器選項,即可明確指定 此行為。

/Zc:thread保管庫Init 編譯器選項預設為開啟。 /permissive- 選項不會影響 /Zc:thread保管庫Init

靜態區域變數的執行緒安全初始化依賴通用 C 執行時間程式庫 (UCRT) 中實作的程式碼。 若要避免相依于 UCRT,或保留 Visual Studio 2015 之前 Visual Studio 版本的非執行緒安全初始化行為,請使用 /Zc:thread保管庫Init- 選項。 如果您知道不需要執行緒安全性,請使用此選項來產生稍微小一點、更快速的靜態本機宣告程式碼。

安全線程靜態區域變數會在內部使用執行緒本機儲存體 (TLS),在靜態已初始化時提供有效率的執行。 這項功能的實作仰賴 Windows Vista 和更新版本的作業系統支援功能。 Windows XP、Windows Server 2003 和舊版作業系統沒有這項支援,因此它們不會獲得效率優勢。 這些作業系統也有可載入之 TLS 區段數目的下限。 超過 TLS 區段限制可能會導致當機。 如果您的程式碼中有問題,特別是在必須在舊版作業系統上執行的程式碼中,請使用 /Zc:thread保管庫Init- 來停用安全線程初始化程式碼。

如需 Visual C++ 中一致性問題的詳細資訊,請參閱 Nonstandard Behavior

在 Visual Studio 開發環境中設定這個編譯器選項

  1. 開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性

  2. 從 [ 組態 ] 下拉式功能表中,選擇 [ 所有組態 ]。

  3. 選取 [組態屬性]>[C/C++]>[命令列] 屬性頁。

  4. 修改 [其他選項 ] 屬性以包含 /Zc:thread保管庫Init /Zc:thread保管庫Init- ,然後選擇 [ 確定 ]。

另請參閱

MSVC 編譯器選項
MSVC 編譯器命令列語法
/Zc (一致性)