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);
}
?>


 

 

posted on 2013-08-06 19:22  you Richer  阅读(627)  评论(0编辑  收藏  举报