首页 话题 小组 问答 好文 用户 我的社区 域名交易 唠叨

[函数]Threaded::synchronized()函数—用法及示例

发布于 2025-05-11 07:09:37
0
11

函数:Threaded::synchronized()

适用版本:PHP 7+

用法:Threaded::synchronized()函数用于在多线程环境中同步访问共享对象。它接受一个回调函数作为参数,并在执行该回调函数期间锁定共享对象,以确保只有一个线程可以访问。

语法:

public Threaded::synchronized ( callable $block , mixed ...$args ) : mixed

参数:

  • $block:一个回调函数,用于在同步块中执行的代码。
  • $args:可选的参数,传递给回调函数。

返回值:回调函数的返回值。

示例:

<?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作为额外的参数传递给回调函数,以便在同步块中访问共享对象。

评论
一个月内的热帖推荐
站长交流