线程更新时对全局指针的影响

impact on global pointers while threads updating it

我担心的是,在线程之间访问时会对全局指针产生什么影响。我的全局指针是线程安全的 class。从代码来看,当 updatethread() 方法用新指针更新指针和 workerthread() 访问指针时,会对全局指针产生什么影响。我应该使用什么同步?

SomeCache* ptrCache = NULL;

    //worker thread
    void Workerthread(std::string strFileToWork)
    {
        while (std::getline(fileStream, strCurrent))
        {                   
            //worker thread accessing the global pointer
        if (ptrCache->SearchValue(strCurrent))
        {           
            iCounter++;
        }
        }
    }

    void updatethread()
    {
        //replace old cache with a new fresh updated.
        SomeCache* ptrOldCache = ptrCache;
        ptrCache = ptrNewCache;
    }

这个行为可能是未定义的,你可以参考这个关于C++中volatile关键字的答案。 如果使用 volatile 关键字,则在执行以下行之前,使用旧值,之后使用新值。否则行为可能依赖于编译器或编译标志。

    ptrCache = ptrNewCache;

mutexes 的一种可能解决方案:

std::mutex ptrCacheMutex;
SomeCache* ptrCache = null_ptr;

void Workerthread(...)
{
    ...
    bool valueFound;
    {
        std::scoped_lock lk(ptrCacheMutex);
        valueFound = ptrCache && ptrCache->SearchValue(...);
    }
    if (valueFound)
        iCounter++;
    ...
}

void updatethread()
{
    ...
    {
        std::scoped_lock lk(ptrCacheMutex);
        auto ptrOldCache = std::exchange(ptrCache, ptrNewCache);
    }
    ...
}

如果您的编译器不支持模板参数推导,您应该明确指定互斥锁类型:std::scoped_lock<std::mutex> ....