ホームページ >バックエンド開発 >PHPチュートリアル >PHP 並行プログラミングにおけるデータ構造同期メカニズム

PHP 並行プログラミングにおけるデータ構造同期メカニズム

王林
王林オリジナル
2024-05-07 13:00:02652ブラウズ

PHP 同時プログラミングでは、次のデータ構造同期メカニズムが重要です。 クリティカル セクション: synchronized キーワードを使用してクリティカル セクションのコード領域を保護し、一度に 1 つのスレッドのみの実行を許可します。 ミューテックス ロック: lock() とによって保証されます。 lock() メソッド 一度に 1 つのスレッドのみが共有リソースにアクセスします。読み取り/書き込みロック: 複数のスレッドが同時に読み取ることができますが、一度に 1 つのスレッドのみが共有データを書き込むことができます。メッセージとタスクの配信、スタック: LIFO データ構造、呼び出しコンテキストの管理に使用されます。実際の場合、同時実行クローラーはキューを使用してクロールされた URL を保存し、ミューテックスを使用してキューのアクセス権を保護し、スレッドの安全性を実現します。

PHP 并发编程下的数据结构同步机制

PHP 並行プログラミングにおけるデータ構造の同期メカニズム

PHP 並行プログラミングでは、複数のスレッドまたはプロセスが共有データに同時にアクセスするときに、正確性と一貫性を確保するために同期メカニズムが非常に重要です。この記事では、PHP でデータ構造を同期するための一般的なメカニズムを検討し、実際の例を示します。

クリティカル セクション

クリティカル セクションは、一度に 1 つのスレッドだけが実行できるようにコード領域を保護するために使用される同期メカニズムです。 PHP では、synchronized キーワードを使用してクリティカル セクションを宣言できます。

class Foo {
    private $data = [];

    public function bar() {
        // 临界区开始
        synchronized($this->data) {
            // 临界区代码,只允许一个线程同时执行
        }
        // 临界区结束
    }
}
synchronized 关键字来声明临界区。

$mutex = new Mutex();

$mutex->lock();
try {
    // 临界区代码...
} finally {
    $mutex->unlock();
}

互斥锁

互斥锁是一种锁对象,用于确保一次只有一个线程可以访问共享资源。PHP 中有多种互斥锁实现,例如 MutexSemaphore 类。

$rwLock = new RWLock();

$rwLock->lockReadOnly();
try {
    // 多个线程可以同时读取共享数据
} finally {
    $rwLock->unlockReadOnly();
}

$rwLock->lockWrite();
try {
    // 只有一个线程可以写入共享数据
} finally {
    $rwLock->unlockWrite();
}

读写锁

读写锁是一种允许多个线程同时读共享数据,但一次只能有一个线程写共享数据的锁对象。PHP 中的 RWLock 类可以实现读写锁。

$queue = new SplQueue();

$queue->enqueue('任务 1');
$queue->enqueue('任务 2');

while (!$queue->isEmpty()) {
    $task = $queue->dequeue();
    // 处理任务
}

队列

队列是一种 FIFO(先进先出)的数据结构,可用于在并发环境中传递消息和任务。PHP 中的 SplQueue 类提供了队列实现。

$stack = new SplStack();

$stack->push('调用 1');
$stack->push('调用 2');

while (!$stack->isEmpty()) {
    $call = $stack->pop();
    // 处理调用
}

栈是一种 LIFO(后进先出)的数据结构,可用于在并发环境中管理调用上下文。PHP 中的 SplStack

ミューテックス

ミューテックスは、一度に 1 つのスレッドだけが共有リソースにアクセスできるようにするために使用されるロック オブジェクトです。 PHP には、Mutex クラスや Semaphore クラスなど、さまざまなミューテックス実装があります。

class Crawler {
    private $queue;
    private $mutex;
    
    public function __construct() {
        $this->queue = new SplQueue();
        $this->mutex = new Mutex();
    }
    
    public function addUrl($url) {
        $this->mutex->lock();
        try {
            $this->queue->enqueue($url);
        } finally {
            $this->mutex->unlock();
        }
    }
    
    public function getNextUrl() {
        $this->mutex->lock();
        try {
            return $this->queue->dequeue();
        } finally {
            $this->mutex->unlock();
        }
    }
}

$crawler = new Crawler();

// 多个线程并发抓取 URL
$threads = [];
for ($i = 0; $i < 10; $i++) {
    $threads[] = new Thread(function() use ($crawler) {
        while (($url = $crawler->getNextUrl()) !== null) {
            // 抓取并处理 URL
        }
    });
}

foreach ($threads as $thread) {
    $thread->start();
}

foreach ($threads as $thread) {
    $thread->join();
}

読み取り/書き込みロック

🎜 読み取り/書き込みロックは、複数のスレッドが同時に共有データを読み取ることを許可するロック オブジェクトですが、一度に 1 つのスレッドのみが共有データに書き込むことができます。 PHP の RWLock クラスは、読み取り/書き込みロックを実装できます。 🎜rrreee🎜🎜Queue🎜🎜🎜Queue は、同時環境でメッセージとタスクを配信するために使用できる FIFO (先入れ先出し) データ構造です。 PHP の SplQueue クラスはキュー実装を提供します。 🎜rrreee🎜🎜スタック🎜🎜🎜スタックは、同時環境で呼び出しコンテキストを管理するために使用できる LIFO (後入れ先出し) データ構造です。 PHP の SplStack クラスはスタック実装を提供します。 🎜rrreee🎜🎜実際のケース: 並行クローラー🎜🎜🎜 並行クローラーでは、クロールされた URL リストは共有データ構造であり、スレッドの安全性を確保するために同期メカニズムが必要です。一般的な方法は、キューを使用してクロールされた URL を保存し、ミューテックスを使用してキューへのアクセスを保護することです。 🎜rrreee🎜 この場合、キューとミューテックス ロックは共同でマルチスレッド同時クロールの同期制御を実現し、URL リストへの正しいアクセスと変更を保証します。 🎜

以上がPHP 並行プログラミングにおけるデータ構造同期メカニズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。