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在调用之前写出成员.
谢谢
不.相关的Win32线程功能都会处理必要的内存障碍.之前的所有写入CreateThread对新线程都是可见的.显然,在调用之前,新创建的线程中的读取不能重新排序CreateThread.
volatile不会在编译器上添加任何额外的有用约束,只会减慢代码速度.但实际上,与创建新线程的成本相比,这种情况并不明显.