首頁 後端開發 php教程 PHP信號量基本用法實例詳解

PHP信號量基本用法實例詳解

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

本文實例講述了PHP信號量基本用法。分享給大家供大家參考,具體如下:

一些理論基礎:

信號量:又稱為信號燈、旗語用來解決進程(線程同步的問題),類似於一把鎖,訪問前獲取鎖(獲取不到則等待),訪問後釋放鎖。
臨界資源:每次僅允許一個程序存取的資源。
臨界區:每個進程中存取臨界資源的那段程式碼叫做臨界區
進程互斥:兩個或以上的進程不能同時進入關於同一組共享變數的臨界區域,即一個進程正在存取臨界資源,另一個進程要想訪問必須等待。
進程同步主要研究如何確定數個進程之間的執行順序和避免數據競爭的問題即,如何讓多個進程能一塊很好的協作運行

舉例子:(來自百度百科)

以一個停車場的運作為例。簡單起見,假設停車場只有三個車位,一開始有三個車位都是空的。這時如果同時來了五輛車,看門人允許其中三輛直接進入,然後放下車攔,剩下的車則必須在入口等待,此後來的車也都不得不在入口處等待。這時,有一輛車離開停車場,看門人得知後,打開車攔,放入外面的一輛進去,如果又離開兩輛,則又可以放入兩輛,如此往復。

在這個停車場系統中,車位是公共資源,每輛車好比一個線程,看門人起的就是信號量的作用。

$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);

登入後複製

Implementation of a read-write semaphore in 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基本語法入門教學》、《PHP錯誤與異常處理方法總結》、《php程式設計演算法總結》及《php物件導向程式設計入門教學》

希望本文所述對大家PHP程式設計有幫助。

以上就介紹了PHP信號量基本用法實例詳解,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Remote 3 通用遙控器配有觸控屏,但無需訂閱或伺服器義務 Remote 3 通用遙控器配有觸控屏,但無需訂閱或伺服器義務 Jun 14, 2024 am 09:13 AM

自從羅技廣受歡迎的 Harmony 遙控器消亡以來,高品質通用遙控器的市場充其量已經被分割。

deepseek怎麼轉換pdf deepseek怎麼轉換pdf Feb 19, 2025 pm 05:24 PM

DeepSeek 無法直接將文件轉換為 PDF。根據文件類型,可以使用不同方法:常見文檔(Word、Excel、PowerPoint):使用微軟 Office、LibreOffice 等軟件導出為 PDF。圖片:使用圖片查看器或圖像處理軟件保存為 PDF。網頁:使用瀏覽器“打印成 PDF”功能或專用的網頁轉 PDF 工具。不常見格式:找到合適的轉換器,將其轉換為 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(在亞馬遜上有售,售價 295 美元)之所以脫穎而出,主要是因為它擁有《薩爾達傳說:曠野之息》等頂級獨佔遊戲。然而,它缺乏第三方開發人員的重要發布。任天堂 Switch 2 可能

Deepin V23 RC2 帶來大量調整和最佳化 Deepin V23 RC2 帶來大量調整和最佳化 Jun 28, 2024 am 07:45 AM

支援人工智慧的 Deepin Linux 發行版剛剛收到最新更新,稱為 V23 RC2。此版本的 Deepin 附帶了大量軟體包更新和新功能。但這不僅僅與功能有關。外觀和感覺是 t 的主要亮點

保時捷洩密事件顯示 EV Boxster 和 Cayman 最快將於 2025 年 10 月取代汽油車型 保時捷洩密事件顯示 EV Boxster 和 Cayman 最快將於 2025 年 10 月取代汽油車型 Jun 15, 2024 pm 04:02 PM

我們之前曾報道即將推出的電動保時捷 Boxster 的洩漏情況,保時捷此前曾承諾到 2030 年電動車佔銷量的 80%,並確認電動 Boxster 和 Cayman 車型將與其常規汽油車一起推出

如何在Node.js環境中解決第三方接口返回403的問題? 如何在Node.js環境中解決第三方接口返回403的問題? Mar 31, 2025 pm 11:27 PM

在Node.js環境中解決第三方接口返回403的問題當我們在使用Node.js調用第三方接口時,有時會遇到接口返回403錯誤�...

Laravel Redis連接共享:為何select方法會影響其他連接? Laravel Redis連接共享:為何select方法會影響其他連接? Apr 01, 2025 am 07:45 AM

Laravel框架中Redis連接的共享與select方法的影響在使用Laravel框架和Redis時,開發者可能會遇到一個問題:通過配置...

See all articles