perlthrtut 摘录:
请注意,共享变量保证如果两个或多个线程同时尝试修改它,变量的内部状态不会被破坏。但是,除此之外没有任何保证,如下一节所述。
在支持多处理器内核线程的 Linux 上工作。
是否保证所有线程都会看到更新的共享变量值?如上所述咨询 perlthrtut 文档没有这样的保证。
现在的问题是:可以以编程方式做些什么来保证这一点?
perlthrtut 摘录:
请注意,共享变量保证如果两个或多个线程同时尝试修改它,变量的内部状态不会被破坏。但是,除此之外没有任何保证,如下一节所述。
在支持多处理器内核线程的 Linux 上工作。
是否保证所有线程都会看到更新的共享变量值?如上所述咨询 perlthrtut 文档没有这样的保证。
现在的问题是:可以以编程方式做些什么来保证这一点?
在变量上使用:shared
会导致所有线程在相同的物理内存地址中引用它,因此它们碰巧在哪个处理器/内核/超线程中执行并不重要。关于保证perlthrtut
的讨论是关于竞争条件的,并且简而言之,您需要考虑到共享变量可以随时被任何线程修改。如果这是一个问题,您将需要使用同步函数(例如和)来控制访问。lock()
cond_wait()
你问
是否保证所有线程都会看到更新的共享变量值?
是的。 :shared
是保证。该值将安全、一致且最新更新。
问题很简单,没有其他同步,你不知道这些更新的顺序。
如上所述咨询 perlthrtut 文档没有这样的保证。
你读得不够远。:)
perlthrtut的下一部分解释了您在使用 perl 线程时遇到的那种陷阱:数据竞争,也就是说,与共享数据有关的应用程序逻辑竞争。同样,共享数据将是一致的和新鲜的,并且不受(或多或少)原子 perl 操作码的破坏。但是,您对该共享数据执行的高级 perl 操作不能保证是原子的。 $shared_var++
,例如,可能不止一个原子操作。
(如果我冒昧地猜测一下,您可能对其他语言的低级线程接口考虑太多了,它们的缓存不一致、单词撕裂、指令重新排序以及狮子、老虎和熊。Perl 的模型处理了这些低级问题为你。)
你似乎对做什么感到困惑:shared
。它使所有线程共享一个变量。
无论哪个线程访问它,变量确实保证具有它所具有的值。这是一个重言式,因此无法以编程方式保证这一点。