函数:Threaded::synchronized()
适用版本:PHP 7+
用法:Threaded::synchronized()函数用于在多线程环境中同步访问共享对象。它接受一个回调函数作为参数,并在执行该回调函数期间锁定共享对象,以确保只有一个线程可以访问。
语法:
public Threaded::synchronized ( callable $block , mixed ...$args ) : mixed
参数:
返回值:回调函数的返回值。
示例:
<?php
class SharedData extends Threaded
{
public $counter = 0;
}
$data = new SharedData();
$worker = new class($data) extends Thread {
private $data;
public function __construct(SharedData $data)
{
$this->data = $data;
}
public function run()
{
$this->data->synchronized(function($data) {
// 在同步块中访问共享对象
$data->counter++;
echo "Thread " . $this->getThreadId() . " incremented the counter to " . $data->counter . PHP_EOL;
}, $this->data);
}
};
$worker->start();
$worker->join();
echo "Counter value after synchronization: " . $data->counter . PHP_EOL;
?>
输出:
Thread 2 incremented the counter to 1
Counter value after synchronization: 1
在上面的示例中,我们创建了一个共享数据对象SharedData
,其中包含一个计数器counter
。然后,我们创建了一个继承自Thread
的匿名类$worker
,它接受SharedData
对象作为构造函数的参数。
在run()
方法中,我们使用synchronized()
函数来确保在访问共享对象$data
时进行同步。在同步块中,我们将计数器递增,并打印线程ID和递增后的计数器值。
最后,我们启动线程并等待它完成。在同步完成后,我们打印出最终的计数器值。
需要注意的是,synchronized()
函数的参数$block
是一个回调函数,可以接受其他参数。在示例中,我们将$data
作为额外的参数传递给回调函数,以便在同步块中访问共享对象。