/Zc:threadSafeInit (安全執行緒區域靜態變數初始設定)
/Zc:threadSafeInit 編譯程式選項會指示編譯程式以安全線程的方式初始化靜態本機(函式範圍)變數,而不需要手動同步處理。 只有初始化是安全線程。 多個線程仍必須手動同步處理靜態局部變數的使用和修改。 此選項可從 Visual Studio 2015 開始提供。 根據預設,Visual Studio 會啟用此選項。
語法
/Zc:threadSafeInit[-]
備註
在 C++11 標準中,具有靜態或線程儲存持續時間的區塊範圍變數必須在進行任何其他初始化之前,以零初始化。 當控件第一次通過變數的宣告時,就會進行初始化。 如果在初始化期間擲回例外狀況,變數會被視為未初始化,且下次控件通過宣告時會重新嘗試初始化。 如果控件在初始化的同時輸入宣告,則初始化完成時並行執行區塊。 如果控件在初始化期間以遞歸方式重新輸入宣告,則行為是未定義的。 根據預設,從Visual Studio 2015開始的Visual Studio會實作此標準行為。 設定 /Zc:threadSafeInit 編譯程序選項,即可明確指定此行為。
/Zc:threadSafeInit 編譯程式選項預設為開啟。 /permissive- 選項不會影響 /Zc:threadSafeInit。
靜態局部變數的線程安全初始化依賴通用 C 運行時間連結庫 (UCRT) 中實作的程式代碼。 若要避免相依於 UCRT,或保留 Visual Studio 2015 之前 Visual Studio 版本的非線程安全初始化行為,請使用 /Zc:threadSafeInit- 選項。 如果您知道不需要線程安全性,請使用此選項來產生稍微小一點、更快速的靜態本機宣告程序代碼。
安全線程靜態局部變數會在內部使用線程本機記憶體 (TLS),在靜態已初始化時提供有效率的執行。 這項功能的實作仰賴 Windows Vista 和更新版本的作業系統支援功能。 Windows XP、Windows Server 2003 和舊版作業系統沒有這項支援,因此它們不會獲得效率優勢。 這些操作系統也有可載入之 TLS 區段數目的下限。 超過 TLS 區段限制可能會導致當機。 如果您的程式代碼中有問題,特別是在必須在舊版操作系統上執行的程式代碼中,請使用 /Zc:threadSafeInit- 來停用安全線程初始化程序代碼。
如需 Visual C++ 中一致性問題的詳細資訊,請參閱 Nonstandard Behavior。
在 Visual Studio 開發環境中設定這個編譯器選項
開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性。
從 [ 組態 ] 下拉功能表中,選擇 [ 所有組態]。
選取 [組態屬性]>[C/C++]>[命令列] 屬性頁。
修改 [其他選項] 屬性以包含 /Zc:threadSafeInit 或 /Zc:threadSafeInit- ,然後選擇 [確定]。