假设操作A对aa.txt进行写操作的同时,操作B又对aa.txt进行写操作,那么很可能会出现操作B的写入会覆盖操作B。
我想到可以对aa.txt加上文件锁,但如此的话在操作A进行写的时候,其他操作就无法进行了。我希望所有操作都可以依次执行,有什么好思路?队列么?

解决方案 »

  1.   

    队列的实现有一定的延迟性,如果不过分追求延迟性的话,完全可以用队列的方式做!加入文件锁,只是靠多个线程的强占,不一定会一次执行!还有楼上的,php没有多线程不代表使用php的架构没有多线程的概念!
      

  2.   

    问下楼上高人
    php不支持多线程还怎么架构法啊?
    能说详细点吗?楼主的问题,我想但凡是面向对象的语言,这种问题可以用静态变量解决。
    你懂的........
    另外可以用多进程的方法。
      

  3.   


    首先我不是高人,只是以前用过笨方法实现多线程以前做过一个大文件(G单位)同步分发的概念,这个同步服务器支持断点续传的功能,使用多线程下载!1、首先是需要紧急,已经具备php(web)和python(不是做web cgi存在,仅是有python)的环境
    2、首先php完成网络请求,对一个文件做块分割,每个块是一个文件,记录块的开始和结束,文件分为未初始化、正在下载、已完成
    3、触发10个系统进程(python脚本)作为当前php的线程来用,每个python脚本处理一个块,直到没有未初始化的块,结束这个脚本
    4、php触发python脚本后,就要做为一个轮询文件状态存在,直到所有块完成,通知同步完成,结束任务这是正确流程关于失败的处理,python脚本的自杀期,当接到块以后10分钟没有完成,自杀
    php轮询文件超过10分钟没有文件改变,自杀,通知同步失败,等待下一次触发执行
    每个下载同步文件最多尝试3次,然后进入手动触发我说的多线程架构webserver请求 -> php处理文件分割、改变状态等 -> 触发多个python脚本(我称之为php当前进程的多线程,虽然python脚本对于os来说是一个进程)当然这个是由于这个任务的周期短,要求急于上线!
      

  4.   

    写文件时,进行锁定,确保一次只有一个线程对文件进行操作。
    多线程来讲,这个是必须的。lock
      

  5.   


    或者我举个简单的例子吧:
    假设有操作A和操作B同时要对aa.txt进行写操作。每一次操作都只是要把txt里面的某个值自增1。那么,当操作A先进行读取aa.txt的那个值时,再增加1变成2。而此时操作B也读取了这个值增加1变成2。然后操作A和B先后对aa.txt进行写入。这样的话,操作B由于在操作A写入之前读取了这个还没自增完成的值而导致操作B的写入操作达不到自增效果了。对于这类情况,我知道可以用flock等文件锁来避免操作B的值覆盖掉操作A的值,但同样的,操作B也因为文件锁而无法完成了。
      

  6.   


    对你这个简单的例子来说: 必须:
    lock file;
    P: read; ++; write;
    unlock file;
    否则必然造成你说的结果如果P操作部分很快(快的意思是等待可以接受),你可以:
    check file locked, 
    if locked{
     wait;
    }else{
     lock file;
     P: read; ++; write;
     unlock file;
    }如果处理时间长,容易造成长期等待.用队列其实是一样的,如果处理时间长, 队列会堵
    所以, 如果真的出现问题,(如果是你说的这个简单的+1,一般等待不会有太大问题)
    不建议用文件,如果你是在说php, 那么用数据库更好,
    数据库可以用事务, 加锁的问题不用你自己考虑太多.
    更何况就你说的例子,
    一句 update table set count=count+1 where id=x
    就行, 连事务都不用