Perl ithreads:共享变量 - 多处理器内核线程 - 可见性

Perl ithreads :shared variables - multiprocessor kernel threads - visibility

perlthrtut 摘录:

Note that a shared variable guarantees that if two or more threads try to modify it at the same time, the internal state of the variable will not become corrupted. However, there are no guarantees beyond this, as explained in the next section.

致力于Linux支持多处理器内核线程。

能否保证所有线程都能看到更新后的共享变量值? 如上所述咨询 perlthrtut 文档没有这样的保证。

现在的问题是:可以通过编程方式做什么来保证这一点?

您似乎对 :shared 的作用感到困惑。它使得一个变量被所有线程共享。

无论哪个线程访问它,一个变量确实保证具有它所具有的值。这是同义反复,因此无法以编程方式保证这一点。

在变量上使用 :shared 会导致所有线程在 相同的物理内存地址 中引用它,因此它们使用哪个 processor/core/hyper-thread 无关紧要perlthrtut 关于 guarantees 的讨论是关于竞争条件的,简而言之,你需要考虑到共享变量可以被修改任何时间任何线程。如果这是一个问题,您需要使用同步功能(例如 lock()cond_wait())来控制访问。

你问

Is there a guarantee that all threads will see the updated shared variable value ?

是的。 :shared 就是保证。该值将安全、一致且最新更新。

问题很简单,没有其他同步,您不知道这些更新的顺序。

Consulting the perlthrtut doc as stated above there is no such guarantee.

您阅读的内容还不够深入。 :)

perlthrtut 的下一部分解释了您 面对 perl 线程的陷阱类型:数据竞争,也就是说,关于共享的应用程序逻辑竞争数据。同样,共享数据将是一致的和新鲜的,并且不受(或多或少)原子 perl 操作码的损坏。但是,您对该共享数据执行的高级 perl 操作保证是原子的。 $shared_var++,例如,可能不止一个原子操作。

(如果我敢猜测,你可能对其他语言的低级线程接口考虑太多,它们的缓存不一致、撕裂的单词、重新排序的指令以及狮子、老虎和熊。Perl 的模型负责那些对你的低级关注。)