2

perlthrtut 摘录:

请注意,共享变量保证如果两个或多个线程同时尝试修改它,变量的内部状态不会被破坏。但是,除此之外没有任何保证,如下一节所述。

在支持多处理器内核线程的 Linux 上工作。

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

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

4

3 回答 3

1

在变量上使用:shared会导致所有线程在相同的物理内存地址中引用它,因此它们碰巧在哪个处理器/内核/超线程中执行并不重要。关于保证perlthrtut的讨论是关于竞争条件的,并且简而言之,您需要考虑到共享变量可以随时被任何线程修改。如果这是一个问题,您将需要使用同步函数(例如和)来控制访问。lock()cond_wait()

于 2015-01-02T20:37:33.600 回答
1

你问

是否保证所有线程都会看到更新的共享变量值?

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

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

如上所述咨询 perlthrtut 文档没有这样的保证。

你读得不够远。:)

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

(如果我冒昧地猜测一下,您可能对其他语言的低级线程接口考虑太多了,它们的缓存不一致、单词撕裂、指令重新排序以及狮子、老虎和熊。Perl 的模型处理了这些低级问题为你。)

于 2015-01-07T21:30:45.403 回答
0

你似乎对做什么感到困惑:shared。它使所有线程共享一个变量。

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

于 2015-01-02T03:17:02.267 回答