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

标签 c++ visual-c++ thread-safety volatile

在 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/

相关文章:

c++ - 将文本日期和时间转换为 ATL::CTime

C++ const char* 重载困惑

c++ - 尝试使用 std::get_time 解析 YYMMDD 并失败

multithreading - 什么时候要注意EJB中的多线程?

c++ - 对象指针 vector ,一般帮助和混淆

可变参数模板参数的 C++ 约束

c++ - 我可以从可变参数函数提前返回吗?

c++ - 错误LNK2019,如何解决? *更新*

java - 不同线程之间代码块的序列化

c# - 线程安全方法?