It's worth mentioning here that, since v2.0.0, 'Stackable' class was an alias for 'Threaded' class but has been removed since.
PHP - Manual: Threaded
2024-11-14
(PECL pthreads >= 2.0.0)
Threaded 对象提供支持 pthreads 操作的基本功能,包括同步方法以及其他对程序员很有帮助的接口。
重要的是,Threaded 提供了隐式的线程安全机制,这个对象中的所有操作都是线程安全的。
It's worth mentioning here that, since v2.0.0, 'Stackable' class was an alias for 'Threaded' class but has been removed since.
> Threaded objects, most importantly, provide implicit safety for the programmer; all operations on the object scope are safe.
However, this comes with a trade-off: Operations on the instance scope are slower than on plain PHP objects.
Static properties are not affected as they are thread-local.
<?php
class Wallet{
public $balance;
public function __construct($money){
$this->balance = $money;
}
public function getBalance(){
return $this->balance;
}
public function setBalance($value){
$this->balance = $value;
}
}
class MyThread extends Thread{
private $wallet;
private $std;
public function __construct($wallet,$std){
$this->wallet = $wallet;
$this->std = $std;
}
public function run(){
$this->synchronized(function($thread){
$hack = $this->wallet;
if($hack->getBalance() - 80 >0){
sleep(1);
$hack->setBalance($hack->getBalance() - 80);
echo $this->getThreadId() . "reduce 80 successful<br/>Current num is:" . $hack->getBalance() . "<Br/>";
//Here is Wrong! The result is bool(false)????!!!!
var_dump($hack == $this->wallet);
}
else
echo $this->getThreadId() . "reduce fail<br/>Current num is:" . $hack->getBalance() . "<br/>";
},$this->std);
}
}
$wallet = new Wallet(200);
$std = new stdClass();
for($x=0;$x<3;$x++){
$pool[] = new MyThread($wallet,$std);
$pool[$x]->start();
}