日期:2014-05-17  浏览次数:20454 次

shmop的问题
是这样的,我在程序中需要频繁处理一段数据,不想每次都向MySQL查询,于是把这些要用的记录取了出来,用shmop放在内存里,方便以后修改。

不过,在写的过程中,我突然想到一个并发控制上的问题,不知道该怎么解决:

function function1(){
读取内存数据
长时间操作(修改了第x1行)
写入内存数据
}

function function2(){
读取内存数据
长时间操作(修改了第x2行)
写入内存数据
}

问题就来了,如果我把function1和function2两函数,从头到尾的用信号量同步,如:
function function1(){
获取信号量
读取内存数据
长时间操作(修改了第x1行)
写入内存数据
释放信号量
}

function function2(){
获取信号量
读取内存数据
长时间操作(修改了第x2行)
写入内存数据
释放信号量
}

那么问题可以解决,但是有违我的初衷,我的初衷是想用缓存加速,但是这样做,长时间操作不能并发执行,这样必然更慢了

如果只在写入或读取的时候同步,如:
function function1(){
获取信号量
读取内存数据
释放信号量

长时间操作(修改了第x1行)

获取信号量
写入内存数据
释放信号量
}

function function2(){
获取信号量
读取内存数据
释放信号量

长时间操作(修改了第x2行)

获取信号量
写入内存数据
释放信号量
}

那么function1如果刚好读完数据,function2写入数据了,function1写入数据时就会擦掉function2写入的数据,function2就白忙活了。。。

很怀恋java Servlet,java Servlet是可以把整个对象保存在内存里,只要能获得对象的引用,修改可以只修改对应行。而php需要把对象序列化以后才能存入内存,要动是整个对象一起动,很麻烦啊。。。

不知道怎么解决,大家讨论讨论?

------解决方案--------------------
去年年底用了一次,导致内存频频出问题,PHP进程死掉,网上一查竟然是WIN XP不支持如销毁等操作。不知道WIN 2003下会不会出现同样的问题。
------解决方案--------------------
反正我操作的时候发现在XP下无法覆盖,销毁内存,只能另外开一个ID重新存储。