php用apc实现的临界区 解决并发,资源互斥同步访问

字体大小: 中小 标准 ->行高大小: 标准
在面对线程或进程的互斥同步的控制问题时,常用的解决办法是:临界区,互斥锁,信号量

临界区保证在某一时刻只有一个线程能够访问到所需资源的方法。

任何时候,只能至多有一个线程处于临界区中。如果多个线程要求进入临界区去访问所需资源,那么在临界区空闲时只允许一个线程进入。若已有线程在临界区内,那么其他的线程必须等待,直到进入的线程离开(应该在限制时间内离开)。离开后,其他线程继续抢占。

临界区与互斥锁相似,但实现起来比较简单,当然面对的问题也没有互斥锁复杂。这里就不展开讨论以上几者的区别了。

对于php应用,更多的情况是由并发引起的资源抢占。

我们利用APC缓存来实现临界区,是基于apc_inc()和apc_dec()这两个函数都是原子操作的特性。


<?php
/**
 * 如果您的 PHP 不支持APC,请安装APC扩展
 */
if (!function_exists('apc_exists')) {
 echo ('This demo needs the APC PHP extension.');
 exit;
}

$key = 'test';
CS_Enter($key);
//do something here
CS_Leave($key);

/**
* 进入临界区
*/
function CS_Enter($key) {
 $key = '_cs_' . $key;
 if (!apc_exists($key)) {
  apc_add($key, 0);
 }
 while (apc_inc($key) != 1) {
  apc_dec($key);
  usleep(10000); // 10ms
 }
}

/**
*离开临界区
*/
function CS_Leave($key) {
 apc_dec('_cs_' . $key);
}
?>

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/67208.html