防止2个线程同时读取/写入同一文件?

时间:2019-01-15 11:50:55

标签: javascript filesystemobject

我有几个模块,都需要从相同的总体queueFile.txt中读取数字。每次模块读取文件中的编号时,它需要在编号上加1,然后将新编号写回到文件中。这些模块的工作速度非常快(有时仅几毫秒即可完成任务)

我只希望一个模块一次能够读取和写入queueFile.txt。如果一个模块正在读取/写入queueFile.txt,我希望其他模块等待直到完成,然后轮到他们了。

到目前为止,我已经尝试了两种方法。两者都涉及在使用queueFile.txt时创建一个锁定文件。

方法1:这使用抛出的错误来确定是否已打开队列锁定文件进行写入。如果还没有,则模块将自己打开队列锁定文件,然后对主队列文件进行操作,然后在完成后关闭队列锁定文件。如果已打开,则模块将尝试10000次打开队列锁定文件,如果仍然失败,则会引发一条消息。

例如:

var count = 0;
var maxTries = 10000;
while(true) {
try {

    var queueLock = fso.OpenTextFile("queueFileLock.txt", 2, true);
   break;

} catch (err) {

    if (++count == maxTries){

       alert("Could not unlock queue file!");
    }
}
}

// do operation on queueFile.txt


//then close the lock
queueLock.close();

// then next module does its work

方法2:这涉及检查队列锁定文件是否存在。如果不是,那么模块将创建队列锁定文件并在主队列文件上工作。如果确实存在队列锁定文件,则模块将在其操作结束时等待活动模块删除队列锁定文件。

例如:

if((fso.FileExists("queueFileLock.txt"))==false){


var tempWrite = fso.OpenTextFile("queueFileLock.txt", 2, true);
    tempWrite.Close(); 


  }else{

while(fso.FileExists("queueFileLock.txt")){
      sleep(((1000*Math.random())+1000));

      }

  }

// do operation on queueFile.txt

//then close the lock
fso.DeleteFile("queueFileLock.txt") 

// then next module does its work

仅使用一个或两个模块,上述方法似乎可以正常工作。但是,我希望使用20个左右的模块时它不会出现问题。上面的方法有时允许2个或更多模块同时访问主队列文件,这使所有事情搞砸了。我不确定这是怎么发生的,因为只有一个模块应该能够打开一个文本文件以在其中写入时间,但是当许多模块正在运行时,情况似乎并非如此。 Windows filesystemobject可能是错误,但我不确定。我什至尝试了以上两种方法,但仍然有两个或两个模块有时能够同时访问queueFile.txt。

关于如何完全阻止两个模块同时访问queuefile.txt的任何想法?

1 个答案:

答案 0 :(得分:0)

我自己使用了异步锁定模块来锁定线程,以防止将同一对象更新为数据库。我认为这也可能与您的情况有关。