PHP信号量基本用法实例详解
发布时间:2020-12-12 21:20:07 所属栏目:PHP教程 来源:网络整理
导读:本篇章节讲解PHP信号量基本用法。供大家参考研究具体如下: 一些理论基础: 信号量 :又称为信号灯、旗语 用来解决进程(线程同步的问题),类似于一把锁,访问前获取锁(获取不到则等待),访问后释放锁。 临界资源 :每次仅允许一个进程访问的资
本篇章节讲解PHP信号量基本用法。分享给大家供大家参考,具体如下: 一些理论基础:信号量:又称为信号灯、旗语 用来解决进程(线程同步的问题),类似于一把锁,访问前获取锁(获取不到则等待),访问后释放锁。临界资源:每次仅允许一个进程访问的资源。临界区:每个进程中访问临界资源的那段代码叫临界区进程互斥:两个或以上的进程不能同时进入关于同一组共享变量的临界区域,即一个进程正在访问临界资源,另一个进程要想访问必须等待。进程同步主要研究如何确定数个进程之间的执行顺序和避免数据竞争的问题 即,如何让多个进程能一块很好的协作运行举例子:(来自百度百科) 以一个停车场的运作为例。简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入外面的一辆进去,如果又离开两辆,则又可以放入两辆,如此往复。 在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用。 Implementation of a read-write semaphore in PHP: 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); }
}
共享内存+信号 实现原子性操作 以上列子来源php手册 sem_get 函数comment 更多关于PHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》及《》 希望本文所述对大家PHP程序设计有所帮助。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |