簡體   English   中英

c++ 函數指針賦值安全嗎?

[英]c++ function pointer assignment is safe?

這段代碼線程安全嗎?

static PFN_SOMEFUNC pfnSomeFunc = nullptr;

PFN_SOMEFUNC SomeFuncGetter();

void CalledFromManyThreads() {
    if (pfnSomeFunc == nullptr)
        pfnSomeFunc = SomeFuncGetter();

    pfnSomeFunc();
}

這不是原子指針操作問題。 有一些特殊條件。

  • SomeFuncGetter() 總是返回相同的地址。
  • SomeFuncGetter() 是線程安全的。

它看起來不是線程安全的,因為全局變量可以在沒有同步的情況下被任何線程修改。 即使賦值也不能保證是原子的。

可以做的是利用一種語言功能,通過將靜態移動到您的函數中來保證線程安全的原子初始化(靜態初始化失敗的一種非常常見的解決方案):

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM