PHP:在线程之间共享静态变量

标签 php multithreading static-variables

我在 PHP 中的不同线程之间共享静态变量时遇到问题。 简单来说,我想 1.在一个线程中写一个静态变量 2.在其他线程中读取它并进行所需的处理并清理它。 为了测试上述要求,我编写了以下 PHP 脚本。

<?php

class ThreadDemo1 extends Thread
{
private $mode;  //to run 2 threads in different modes
private static $test;  //Static variable shared between threads

//Instance is created with different mode
function __construct($mode) {
    $this->mode = $mode;            
}

//Set the static variable using mode 'w'
function w_mode() {
   echo 'entered mode w_mode() funcion';
   echo "<br />";

   //Set shared variable to 0 from initial 100
   self::$test = 100;

   echo "Value of static variable : ".self::$test;
   echo "<br />";
   echo "<br />";

   //sleep for a while
   sleep(1);

}

//Read the staic vaiable set in mode 'W'
function r_mode() {
   echo 'entered mode r_mode() function';
   echo "<br />";

   //printing the staic variable set in W mode
   echo "Value of static variable : ".self::$test;
   echo "<br />";
   echo "<br />";

   //Sleep for a while
   sleep(2);

}

//Start the thread in different modes
public function run() {

//Print the mode for reference
echo "Mode in run() method: ".$this->mode;
echo "<br />";

    switch ($this->mode)
    {

    case 'W':
          $this->w_mode();
          break;

   case 'R':
         $this->r_mode();
         break;

  default:
        echo "Invalid option";        

        }      
    }
}


$trd1 = new ThreadDemo1('W');
$trd2 = new ThreadDemo1('R');
$trd3 = new ThreadDemo1('R');
$trd1->start();
$trd2->start();
$trd3->start();
?>

预期输出是, run() 方法中的模式:W 进入模式 w_mode() 函数 静态变量的值:100

run() 方法中的模式:R 进入模式 r_mode() 函数 静态变量的值:100

run() 方法中的模式:R 进入模式 r_mode() 函数 静态变量的值:100

但实际上我得到的输出是, run() 方法中的模式:W 进入模式 w_mode() 函数 静态变量的值:100

run() 方法中的模式:R 进入模式 r_mode() 函数 静态变量的值:

run() 方法中的模式:R 进入模式 r_mode() 函数 静态变量的值:

....真的不知道原因。请帮忙。

最佳答案

静态变量不在上下文之间共享,原因是静态变量具有类入口作用域,而处理程序用于管理对象作用域。

启动新线程时,会复制静态信息(删除复杂变量,如对象和资源)。

静态范围可以被认为是一种线程本地存储。

此外,如果成员不是静态的...从 pthreads 定义派生的类的所有成员都被认为是公共(public)的。

我鼓励您阅读与 pthreads 一起分发的示例,它们也可以在 github 上找到。

关于PHP:在线程之间共享静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17274011/

相关文章:

php - 从我的 MySQL 表检查登录信息

php - MySQL-FULLTEXT 模式匹配

java - Java EE 的长事务时间解决方案?

c# - Parallel.For 跳过元素

java - 如何在移动 Sprite 时重新绘制小程序?

php - 根据 PHP 或 Javascript IF 和 ELSE 测试的结果显示 Google Adsense 代码

php - 字母之间的笔划字符之间的间距相等

java - 静态变量和 block 之间的执行顺序是如何执行的?

java - Java-线程和静态变量

python - Python中的高效内存