这里的临界资源指的是(获取锁成功的处理流程,不过并不是整个过程都涉及资源的争用情况,因为你也不想坐电梯[自己想去一层的],到了二层的时候才去按一层的按钮,而在按下之前的瞬间电梯已经决定往上走了,因为楼上有人想下去~ hiahia...)
<?php
/*----------------------
上一篇出现的一个问题就是,当因为进程操作时间过长,而导致所自动释放,超时进程又误删了其它进程的锁
误删这种情况其实并没有继续影响其它进程的操作,而只是让重置锁的状态为空闲,让其它进程有机会去竞争
进程之间本应串行的访问临界资源,而此时却成为并行的了,这样的操作可能导致程序的最终状态不确定。
------------------------*/
/*---------------------- 而本此修改,并不能解决操作超时的情况,但是可以减少多个进程同时访问临界资源的可能性*/
/**
* @define lock的定义,对商城商品进行加索
*/
/*----------------- 常量定义*/
define('USER', 'user:');
define('INVENTORY', 'inventory:');
define('MARKET', 'market');
/*----------------- 公共方法*/
function log_($message)
{
printf($message.PHP_EOL);
sleep(1);
}
function getKey($handler, $key, $value, $limited)
{
$start_ = time();
try{
while(time() - $start_ < $limited) {
$ret = $handler->setNx($key, $value);
if($ret) {
$handler->setTimeout($key, $limited);
return true;
}
usleep(100);
}
return false;
} catch(Exception $ex) {
return false;
}
}
function delKey($handler, $key, $value)
{
$value = $handler->get($key);
$handler->watch($key); //删除锁其实也是一个资源争用的过