C++ - 传递给线程的数据是否应该是易失性的?

loo*_*oop 5 c++ volatile thread-safety visual-c++

在Microsoft Visual C++中,我可以通过启动带有一个void *参数的函数来调用CreateThread()来创建线程.我将指向结构的指针作为该参数传递,我看到很多其他人也这样做了.

我的问题是,如果我传递指向我的结构的指针,我如何知道在调用CreateThread()之前结构成员是否已实际写入内存?有没有保证他们不会被缓存?例如:

struct bigapple { string color; int count; } apple;
apple.count = 1;
apple.color = "red";
hThread = CreateThread( NULL, 0, myfunction, &apple, 0, NULL );

DWORD WINAPI myfunction( void *param )
{
    struct bigapple *myapple = (struct bigapple *)param;

    // how do I know that apple's struct was actually written to memory before CreateThread?
    cout << "Apple count: " << myapple->count << endl; 
}
Run Code Online (Sandbox Code Playgroud)

今天下午,在我阅读的时候,我在这个网站上看到了很多Windows代码,而其他人则传递了一些不易变为线程的数据,并且似乎没有任何内存障碍或其他任何内容.我知道C++或者至少旧的版本不是"线程感知"所以我想知道是否还有其他原因.我的猜测是编译器看到我在调用CreateThread()时传递了指针和苹果,因此它知道apple在调用之前写出成员.

谢谢

MSa*_*ers 5

不.相关的Win32线程功能都会处理必要的内存障碍.之前的所有写入CreateThread对新线程都是可见的.显然,在调用之前,新创建的线程中的读取不能重新排序CreateThread.

volatile不会在编译器上添加任何额外的有用约束,只会减慢代码速度.但实际上,与创建新线程的成本相比,这种情况并不明显.