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

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

May 07, 2024 pm 01:00 PM
php 同時プログラミング 同期機構

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

この章では、CakePHP の環境変数、一般設定、データベース設定、電子メール設定について理解します。

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

See all articles