Multithreading C++11多线程数据保护语义

Multithreading C++11多线程数据保护语义,multithreading,c++11,Multithreading,C++11,在以下代码中: class SomeClass { private: static SomeType sharedvar; static std::mutex Mutex; public: void DoStuff() { Mutex.lock(); //do stuff with sharedvar Mutex.unlock(); } } 是否可以保证在

在以下代码中:

class SomeClass  
{  
private:  
    static SomeType sharedvar;  
    static std::mutex Mutex;  
public:   
    void DoStuff()  
    {  
        Mutex.lock();  
        //do stuff with sharedvar  
        Mutex.unlock();  
    }  
} 
是否可以保证在调用Mutex.unlock时,对sharedvar的更改将实际存储,而不是简单地保存在CPU的缓存中?我读过一个类似的全局变量示例,它解释了发生这种行为的原因是编译器无法知道外部库中实现的函数是否访问全局变量,因此必须在每次调用该函数之前更新该变量。但是,在本例中,sharedvar是私有的,只能由在SomeClass中声明的函数访问,编译器可以看到并假设这些函数。如果在调用Mutex.unlock时更新了sharedvar,那么这种行为是如何发生的/为什么发生的请详细解释?如果不是,我能做些什么来修复我需要的?我还有一个疯狂的想法,将std::mutex::lock声明为友元函数,以重新引入我认为使上述示例起作用的不确定性。

是的,这是有保证的

我想引用标准,但我现在没有,所以我引用的是cppreference.com。它说明了操作的内存顺序

同一互斥体上的先前解锁操作与std::memory\u顺序中定义的此操作同步

此操作与std::memory_order中定义的任何后续锁定操作同步,该操作获得相同互斥锁的所有权


如果互斥量不是静态的,并且存在多个实例,则无法正确同步。锁定和解锁的内存顺序仅适用于同一个互斥锁。

在大多数情况下,不应直接锁定互斥锁,而应使用作用域锁,例如。这是一个好问题。这取决于硬件、操作系统和编译器。也就是说,同样的问题也可以考虑编译器的指令重新排序等。根据经验,我从来没有看到过由于延迟SydVaR写入造成的问题。但这不是证明。@chmike我正在处理一个有两个静态私有类成员的项目:一个指向动态分配的数组,另一个保持数组长度的整数。我担心其中一个可能会先写入另一个。对不起,我本想让互斥锁成为静态的,我修改了代码。