use*_*938 4 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 Code Online (Sandbox Code Playgroud)
预期输出为,Mode in run()方法:W进入模式w_mode()函数静态变量的值:100
run in()方式模式:R进入模式r_mode()函数静态变量的值:100
run in()方式模式:R进入模式r_mode()函数静态变量的值:100
但实际上我得到的输出为,模式在run()方法中:W进入模式w_mode()函数静态变量的值:100
模式在run()方法中:R进入模式r_mode()函数静态变量的值:
模式在run()方法中:R进入模式r_mode()函数静态变量的值:
....真的没有意识到原因.请帮忙.
静态变量不在上下文之间共享,原因是静态变量具有类入口范围,处理程序用于管理对象范围.
启动新线程时,将复制静态(删除复杂变量,如对象和资源).
静态范围可以被认为是一种线程本地存储.
此外,如果成员不是静态的...派生自pthreads定义的类的所有成员都被视为公共成员.
我鼓励您阅读使用pthread分发的示例,它们也可以在github上找到.
Pau*_*l S -4
你是如何实现多线程的?
PHP 不具备与 Java 等语言相同的线程支持,在 Java 中,您有一个在应用程序级别持续运行的 JVM。
对于 PHP,每个页面请求都会创建一个新的 PHP 实例来处理该请求,并且静态变量的范围仅适用于每个正在运行的实例。
要在线程之间共享数据,您需要根据您的要求将值存储在数据库、会话或简单文件中。
| 归档时间: |
|
| 查看次数: |
2975 次 |
| 最近记录: |