繁体   English   中英

写入时副本的线程安全性

[英]Thread safety of copy on write

我试图了解开发线程安全应用程序的正确方法。

在目前的项目中,我有以下课程:

class Test
{
public:
    void setVal(unsigned int val)
    {
        mtx.lock();
        testValue = val;
        mtx.unlock();
    }

    unsigned int getVal()
    {
        unsigned int copy = testValue;
        return copy;
    }
private:
    boost::mutex mtx;
    unsigned int testValue;
}

我的问题是:在多线程环境中上面的方法是Test :: getVal()threadsafe,还是在复制前必须锁定? 我读过一些关于COW的文章,现在我不确定。

谢谢!

如果您有可以在多个线程之间共享的数据(例如您的testValue成员),则必须同步对该数据的所有访问。 “Synchronize”在这里有广泛的含义:它可以使用互斥锁,通过使数据成为原子,或通过显式调用内存屏障来完成。

但你不能忽略这一点。 在具有多个线程,CPU内核,CPU和高速缓存的并行世界中,如果一个线程的写入在同步原语上没有“握手”,则无法保证一个线程的写入对另一个线程可见。 当线程T2写入testValue ,很可能线程T1的testValue缓存条目不会被更新,正是因为硬件缓存管理系统看到“没有同步发生,线程不访问共享数据,为什么我应该破坏性能通过使缓存无效?“

C ++ 11标准章节[intro.multithread]比你想要的更详细,但这里有一个非正式的注释,总结了这个想法:

5 ...非正式地,对其它存储位置A的力之前的副作用执行释放操作变得到稍后A.执行消耗或获取操作其他线程可见...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM