• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP信号量的用法及实例

php 搞代码 4年前 (2022-01-24) 15次浏览 已收录 0个评论

本篇文章主要介绍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); }}<b>/本文来源gao@!dai!ma.com搞$$代^@码5网@</b><strong>搞代gaodaima码</strong>

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP信号量的用法及实例
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址