首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止两个线程同时读/写同一个文件吗?

防止两个线程同时读/写同一个文件吗?
EN

Stack Overflow用户
提问于 2019-01-15 19:50:55
回答 1查看 107关注 0票数 0

我有几个模块,它们都需要从相同的整体queueFile.txt中读取一个数字。模块每次读取文件中的数字时,都需要将数字加1,然后将新数字写回到文件中。这些模块的工作速度非常快(有时任务只有几毫秒)

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

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

方法1:此方法使用抛出的错误来确定队列锁文件是否已打开以进行写入。如果没有,模块将自己打开队列锁文件,然后继续处理主队列文件,然后在完成后关闭队列锁文件。如果已经打开,模块将尝试打开队列锁文件10000次,如果仍然不成功,则抛出一条消息。

例如:

代码语言:javascript
运行
复制
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:这涉及到检查队列锁文件是否存在。如果没有,那么模块将创建一个队列锁文件,并继续处理主队列文件。如果队列锁文件确实存在,则模块将等待活动模块在其操作结束时删除队列锁文件。

例如:

代码语言:javascript
运行
复制
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个左右的模块时是完美的。上述方法有时允许两个或更多模块同时访问主队列文件,这会使一切变得混乱。我不确定这是如何发生的,因为一次应该只有一个模块能够打开一个文本文件进行写入,但当许多模块正在运行时,情况似乎并非如此。也许这是Windows文件系统对象的错误,但我不确定。我甚至尝试过上面的两种方法,但仍然有两个或两个模块能够同时访问queueFile.txt。

关于如何完全阻止两个模块同时访问queuefile.txt有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2019-01-15 20:08:57

我使用这个模块异步锁定线程,使其不能更新相同的对象到数据库。我认为它也可以与你的情况相关。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54198262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档