3
IMAGIN這樣的:通過C函數調用線程安全的靜態初始化?
void *ImCalledByThreads (/*...*/)
{
//some stuff
static typePlaceholder AmIThreadSafe = QuestionTag();
//other stuff
}
這是初始化線程?
即使QuestionTag()
是線程安全的,如果第一個線程運行該函數而另一個線程調用此行,會發生什麼情況。是否會檢測到函數只會執行一次?或者這對於多線程來說只是一個壞主意?
這不是合法的C代碼。但是如果你在談論C++而不是C,那麼它肯定不是線程安全的。我不確定C++ 11是怎麼說的,但C++ 03和更早版本根本沒有提到線程。從我從各種編譯器看到的生成代碼中,他們不會在變量初始化的基礎上添加任何同步原語。 –
@AdamRosenfield它在gcc(C++)中是線程安全的,C++ 11要求它是 – nos
愚蠢的MSVC ....我說的是純粹的C但是我只是在Windows上測試了這個,沒有錯誤。但是我忘記了這對C++標準來說是不可靠的,因爲MSVC期望C代碼。不管怎麼說,還是要謝謝你。 – dhein