【发布时间】:2023-03-10 20:01:01
【问题描述】:
我想在多个线程之间共享一些变量,共享变量可以是任何数据类型(原始数据类型、数组、结构或类的实例等)。
如果我将访问这些共享变量的代码包含在临界区中,一个线程所做的更改是否会对其他线程可见?
我知道对于原始数据类型,临界区方法有效,但我不确定其他数据类型,即使我相信答案是肯定的(因为 CPU 不关心数据类型,它是只是处理位)。
【问题讨论】:
-
借助像 Windows 这样的现代多任务保护系统,单个进程中的所有线程都可以访问进程中的所有数据。所有非局部变量都已“共享”。它们对进程中的所有线程都是“可见的”。也许如果您详细说明您遇到的实际问题,我们可能会为您提供更好的帮助?
-
我认为问题在于缓存问题。多个线程共享的变量应声明为
volatile,以确保所有线程立即看到更新。 -
我想你已经问过这个问题了。也许不止一次。
-
@Someprogrammerdude,当您在多 CPU 主机上运行多个线程时,“可见性”是一个大问题。当然,所有线程都看到所有相同的变量,但它们不一定就这些变量的更新发生的时间(或顺序)达成一致。编程系统的“内存模型”告诉您何时可以依赖一个线程所做的更新对其他线程可见:en.wikipedia.org/wiki/Memory_model_(programming)
-
内存就是内存。不管是简单的整数还是复杂的结构。这只是记忆。
标签: c++ multithreading winapi