在 Microsoft Visual C++ 中,我可以调用 CreateThread() 通过使用一个函数启动一个线程来创建线程void *
范围。我将一个指向结构的指针作为该参数传递,并且我看到很多其他人也这样做。
我的问题是,如果我传递一个指向结构的指针,我如何知道在调用 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;
}
今天下午,当我阅读时,我在这个网站和其他网站上看到了很多 Windows 代码,这些代码传递的数据对于线程来说不是易失性的,而且似乎没有任何内存屏障或其他任何东西。我知道 C++ 或至少旧版本不是“线程感知”,所以我想知道是否还有其他原因。我的猜测是编译器看到我在对 CreateThread() 的调用中传递了一个指针 &apple ,因此它知道写出以下成员apple
在通话之前。
Thanks
不会。相关的 Win32 线程函数都会处理必要的内存屏障。之前的所有写入CreateThread
对新线程可见。显然,在调用之前,新创建的线程中的读取不能重新排序CreateThread
.
volatile
不会对编译器添加任何额外有用的约束,而只会减慢代码速度。但实际上,与创建新线程的成本相比,这一点并不明显。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)