ホームページ バックエンド開発 PHPチュートリアル PHPセマフォの基本的な使用例を詳しく解説

PHPセマフォの基本的な使用例を詳しく解説

Jul 29, 2016 am 09:03 AM
access release resource sem this

この記事の例では、PHP セマフォの基本的な使用法について説明します。以下のように、参考のためにみんなと共有してください:

いくつかの理論的根拠:

セマフォ: セマフォ、セマフォとも呼ばれ、ロックと同様に、プロセス (スレッド同期問題) を解決するために使用され、アクセス (get) する前にロックを取得します。そうでない場合は待機し、アクセス後にロックを解除します。
重要なリソース: 一度に 1 つのプロセスのみがアクセスを許可されるリソース。
クリティカル セクション: クリティカルなリソースにアクセスする各プロセスのコード セクションは、クリティカル セクションと呼ばれます。
プロセスの相互排他: 2 つ以上のプロセスが、同じ共有変数セットのクリティカル セクションに同時に入ることはできません。 1 つのプロセスが重要なリソースにアクセスしており、別のプロセスが重要なリソースにアクセスしている場合、プロセスはアクセスする前に待機する必要があります。
プロセス同期は、主に、複数のプロセス間の実行順序を決定し、データ競合の問題を回避する方法、つまり、複数のプロセスをうまく連携させる方法を研究します

例: (百度百科事典より)

駐車場 1 台で、フィールドは一例です。話を簡単にするために、駐車場には 3 台の駐車スペースしかなく、最初は 3 台の駐車スペースすべてが空いていると仮定します。このとき、5台の車が同時に来た場合、門番はそのうちの3台の直接入場を許可し、その後、車止めを下ろし、残りの車は入口で待機し、後続の車両も入口で待機することになります。入り口。このとき、一台の車が駐車場から出ていき、それを知った門番は、車の柵を開けて外に車を入れ、あと二台出れば、さらに二台入れるというようにした。

この駐車場システムでは、駐車スペースは公共リソースであり、各車は糸のようなものであり、門番は信号機の役割を果たします。

$key=ftok(__FILE__,'t');
/**
 * 获取一个信号量资源
 int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]] 
 $max_acquire:最多可以多少个进程同时获取信号
 $perm:权限 默认 0666
 $auto_release:是否自动释放信号量
 */
$sem_id=sem_get($key);
#获取信号
sem_acquire($seg_id);
//do something 这里是一个原子性操作
//释放信号量
sem_release($seg_id);
//把次信号从系统中移除
sem_remove($sem_id);
//可能出现的问题
$fp = sem_get(fileinode(__DIR__), 100);
sem_acquire($fp);
$fp2 = sem_get(fileinode(__DIR__), 1));
sem_acquire($fp2);

ログイン後にコピー

PHPでの読み書きセマフォの実装:

class rw_semaphore {
  const READ_ACCESS = 0;
  const WRITE_ACCESS = 1;  
  /**
   * @access private
   * @var resource - mutex semaphore
   */
  private $mutex;
  /**
   * @access private
   * @var resource - read/write semaphore
   */
  private $resource;
  /**
   * @access private
   * @var int
   */
  private $writers = 0;
  /**
   * @access private
   * @var int
   */
  private $readers = 0;
  /**
   * Default constructor
   * 
   * Initialize the read/write semaphore
   */
  public function __construct() {
    $mutex_key = ftok('/home/cyrus/development/php/sysvipc/rw_semaphore.php', 'm');
    $resource_key = ftok('/home/cyrus/development/php/sysvipc/rw_semaphore.php', 'r');    
    $this->mutex = sem_get($mutex_key, 1);
    $this->resource = sem_get($resource_key, 1);    
  }
  /**
   * Destructor
   * 
   * Remove the read/write semaphore
   */
  public function __destruct() {
    sem_remove($this->mutex);
    sem_remove($this->resource);
  }
  /**
   * Request acess to the resource
   * 
   * @param int $mode
   * @return void
   */
  private function request_access($access_type = self::READ_ACCESS) {  
    if ($access_type == self::WRITE_ACCESS) {
      sem_acquire($this->mutex);
      /* update the writers counter */
      $this->writers++;
      sem_release($this->mutex);      
      sem_acquire($this->resource);
    } else {      
      sem_acquire($this->mutex);      
      if ($this->writers > 0 || $this->readers == 0) {        
        sem_release($this->mutex);        
        sem_acquire($this->resource);        
        sem_acquire($this->mutex);        
      }
      /* update the readers counter */
      $this->readers++;
      sem_release($this->mutex);
    }
  }
  private function request_release($access_type = self::READ_ACCESS) {
    if ($access_type == self::WRITE_ACCESS) {
      sem_acquire($this->mutex);
      /* update the writers counter */
      $this->writers--;
      sem_release($this->mutex);
      sem_release($this->resource);
    } else {
      sem_acquire($this->mutex);
      /* update the readers counter */
      $this->readers--;
      if ($this->readers == 0)
        sem_release($this->resource);
      sem_release($this->mutex);
    }
  }
  /**
   * Request read access to the resource
   * 
   * @return void
   */
  public function read_access() { $this->request_access(self::READ_ACCESS); }
  /**
   * Release read access to the resource
   * 
   * @return void
   */
  public function read_release() { $this->request_release(self::READ_ACCESS); }
  /**
   * Request write access to the resource
   * 
   * @return void
   */
  public function write_access() { $this->request_access(self::WRITE_ACCESS); }
  /**
   * Release write access to the resource
   * 
   * @return void
   */
  public function write_release() { $this->request_release(self::WRITE_ACCESS); }
}

ログイン後にコピー

アトミック操作を実現するための共有メモリ+信号

$SHM_KEY = ftok("/home/joeldg/homeymail/shmtest.php", 'R');
$shmid = sem_get($SHM_KEY, 1024, 0644 | IPC_CREAT);
$data = shm_attach($shmid, 1024);
// we now have our shm segment
// lets place a variable in there
shm_put_var ($data, $inmem, "test");
// now lets get it back. we could be in a forked process and still have
// access to this variable.
printf("shared contents: %s\n", shm_get_var($data, $inmem));
shm_detach($data); 

ログイン後にコピー

上記の例は、PHPマニュアルのsem_get関数のコメントからのものです

PHP関連の詳細コンテンツ 興味のある読者は、このサイトの特別トピック「PHP 基本構文の入門チュートリアル」、「PHP エラーおよび例外処理方法の概要」、「PHP プログラミング アルゴリズムの概要」、および「PHP オブジェクト指向プログラミングの入門チュートリアル」を参照してください。 「

この記事が PHP プログラミングのすべての人に役立つことを説明できれば幸いです。

以上、PHPセマフォの基本的な使用例を内容も含めて詳しくご紹介しましたが、PHPチュートリアルに興味のある方の参考になれば幸いです。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

Remote 3 ユニバーサル リモコンにはタッチスクリーンが付属していますが、サブスクリプションやサーバーの義務はありません Remote 3 ユニバーサル リモコンにはタッチスクリーンが付属していますが、サブスクリプションやサーバーの義務はありません Jun 14, 2024 am 09:13 AM

Logitech の人気の Harmony リモコンの終焉以来、高品質ユニバーサル リモコンの市場はせいぜい断片化しています。Unfolded Circle は、サーバーの義務やサブスクを排除することで Harmony Ultimate の運命を回避することを目指しています。

DeepSeek PDFを変換する方法 DeepSeek PDFを変換する方法 Feb 19, 2025 pm 05:24 PM

DeepSeekはファイルを直接PDFに変換できません。ファイルの種類に応じて、異なる方法を使用できます。一般的なドキュメント(Word、Excel、PowerPoint):Microsoft Office、Libreoffice、その他のソフトウェアを使用してPDFとしてエクスポートします。画像:画像ビューアまたは画像処理ソフトウェアを使用してPDFとして保存します。 Webページ:ブラウザの「Print into PDF」関数を使用するか、PDFツールに専用のWebページを使用します。 UNCOMMONフォーマット:適切なコンバーターを見つけて、PDFに変換します。適切なツールを選択し、実際の状況に基づいて計画を作成することが重要です。

Oracleでdbfファイルを読み取る方法 Oracleでdbfファイルを読み取る方法 May 10, 2024 am 01:27 AM

Oracle は、次の手順で dbf ファイルを読み取ることができます。外部テーブルを作成し、その dbf ファイルを参照し、データを Oracle テーブルにインポートします。

Nintendo Switch 2、主要なサードパーティ製 AAA ポートを搭載して発売へ Nintendo Switch 2、主要なサードパーティ製 AAA ポートを搭載して発売へ Aug 10, 2024 am 06:43 AM

Nintendo Switch (Amazon で 295 ドルで購入可能) は、主に『ゼルダの伝説 ブレス オブ ザ ワイルド』のようなトップクラスの独占タイトルによって際立っています。ただし、サードパーティ開発者からの重要なリリースはありません。 Nintendo Switch 2 は、

Deepin V23 RC2 は豊富な調整と豊富な最適化を備えて登場します Deepin V23 RC2 は豊富な調整と豊富な最適化を備えて登場します Jun 28, 2024 am 07:45 AM

AI 対応の Deepin Linux ディストリビューションは、V23 RC2 と呼ばれる最新のアップデートを受け取りました。 Deepin のこのバージョンには、多数のパッケージ更新と新機能が付属しています。しかし、機能だけがすべてではありません。外観と感触が主なスポットライトです

ポルシェのリークはEVボクスターとケイマンが早ければ2025年10月にもガソリンモデルに置き換わる可能性を示唆 ポルシェのリークはEVボクスターとケイマンが早ければ2025年10月にもガソリンモデルに置き換わる可能性を示唆 Jun 15, 2024 pm 04:02 PM

私たちは以前、今後発売される電動ポルシェボクスターのファンのリークについて報告しており、ポルシェは以前、2030年までに販売の80%をEVにすることにコミットしており、通常のガソリンエンジンとともに電動ボクスターとケイマンモデルも導入されることを確認した。

node.js環境で403を返すサードパーティインターフェイスの問題を解決する方法は? node.js環境で403を返すサードパーティインターフェイスの問題を解決する方法は? Mar 31, 2025 pm 11:27 PM

node.js環境で403を返すサードパーティインターフェイスの問題を解決します。 node.jsを使用してサードパーティのインターフェイスを呼び出すと、403を返すインターフェイスから403のエラーが発生することがあります...

Laravel Redis接続共有:選択方法が他の接続に影響するのはなぜですか? Laravel Redis接続共有:選択方法が他の接続に影響するのはなぜですか? Apr 01, 2025 am 07:45 AM

Laravel FrameworkでRedis接続の共有の影響とLaravelフレームワークとRedisを使用する際のメソッドを選択すると、開発者は問題に遭遇する可能性があります。

See all articles