[英]c++ function pointer assignment is safe?
這段代碼線程安全嗎?
static PFN_SOMEFUNC pfnSomeFunc = nullptr;
PFN_SOMEFUNC SomeFuncGetter();
void CalledFromManyThreads() {
if (pfnSomeFunc == nullptr)
pfnSomeFunc = SomeFuncGetter();
pfnSomeFunc();
}
這不是原子指針操作問題。 有一些特殊條件。
它看起來不是線程安全的,因為全局變量可以在沒有同步的情況下被任何線程修改。 即使賦值也不能保證是原子的。
您可以做的是利用一種語言功能,通過將靜態移動到您的函數中來保證線程安全的原子初始化(靜態初始化失敗的一種非常常見的解決方案):
void CalledFromManyThreads() {
static PFN_SOMEFUNC pfnSomeFunc = SomeFuncGetter();
pfnSomeFunc();
}
現在它是線程安全的。 如果你需要在多個地方緩存結果,你可以包裝它:
PFN_SOMEFUNC GetSomeFunc()
{
static PFN_SOMEFUNC pfnSomeFunc = SomeFuncGetter();
return pfnSomeFunc;
}
void CalledFromManyThreads() {
PFN_SOMEFUNC pfnSomeFunc = GetSomeFunc();
pfnSomeFunc();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.