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