gpt4 book ai didi

C++ - 传递给线程的数据应该是易变的吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:16 27 4
gpt4 key购买 nike

在 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;
}

今天下午,当我阅读时,我在这个网站和其他网站上看到了很多 Windows 代码,这些代码将非 volatile 数据传递给线程,而且似乎没有任何内存障碍或其他任何东西。我知道 C++ 或至少较旧的修订版不是“线程感知”的,所以我想知道是否还有其他原因。我的猜测是编译器看到我在对 CreateThread() 的调用中传递了一个指针 &apple,因此它知道在调用之前写出 apple 的成员。

谢谢

最佳答案

没有。相关的 Win32 线程函数都负责必要的内存屏障。 CreateThread 之前的所有写入对新线程都是可见的。显然,在调用 CreateThread 之前,不能对新创建的线程中的读取进行重新排序。

volatile 不会对编译器添加任何额外有用的约束,只会减慢代码速度。不过,在实践中,与创建新线程的成本相比,thiw 不会引人注意。

关于C++ - 传递给线程的数据应该是易变的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12363211/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com