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

时间:2015-01-02 00:23:24

标签: multithreading perl multiprocessor memory-visibility

perlthrtut摘录:

  

请注意,共享变量可确保在两个或多个线程尝试时使用   在修改它的同时,变量的内部状态会   不会变得腐败。但是,除此之外没有任何保证   在下一节中解释。

使用Linux支持多处理器内核线程。

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

你问

  

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

是。 :shared就是保证。该值将安全,一致且新近更新。

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

  

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

你读得不够远。 :)

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

(如果我可能会猜测,你可能会想太多关于其他语言的低级线程接口,其缓存不一致,撕裂的单词,重新排序的指令,以及狮子和老虎和熊.Perl的模型处理那些低 - 关心你的问题。)

答案 2 :(得分:0)

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

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