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

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

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

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

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

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

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

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 12:08:57

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

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

https://stackoverflow.com/questions/54198262

复制
相关文章
使用多线程实现文件的下载_多线程写同一个文件
1、首先要知道请求下载的服务器支持断点下载,即支持request头信息中的Range的设置
全栈程序员站长
2022/11/04
8780
Golang 读、写文件
这种方式每次都会覆盖 test.txt内容,如果test.txt文件不存在会创建。
孤烟
2020/09/27
2.2K0
2020-12-11:多个线程同时写同一个日志文件,为什么相互写的内容不会被覆盖?
3.系统级别。当打开文件并设置了O_APPEND标识,内核会共享文件写入游标,保证内容不会被覆盖。
福大大架构师每日一题
2020/12/11
1.6K0
Hibernate中SessionFactory是线程安全的吗?Session是线程安全的吗(两个线程能够共享同一个Session吗)?
SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,可以被多个线程并发访问。SessionFactory一般只会在启动的时候构建。对于应用程序,最好将SessionFactory通过单例模式进行封装以便于访问。Session是一个轻量级非线程安全的对象(线程间不能共享session),它表示与数据库进行交互的一个工作单元。Session是由SessionFactory创建的,在任务完成之后它会被关闭。Session是持久层服务对外提供的主要接口。Session会延迟获取数据库连接(也就是在需要的时候才会获取)。为了避免创建太多的session,可以使用ThreadLocal将session和当前线程绑定在一起,这样可以让同一个线程获得的总是同一个session。Hibernate 3中SessionFactory的getCurrentSession()方法就可以做到。
唐怀瑟
2018/08/30
1.8K0
多线程是同时执行多个线程的吗
相信多线程各位大佬都用过,不管是在单核cpu还是多核cpu上都可以执行,但是多线程是同时执行多个线程的吗?
余生大大
2022/11/02
1.1K0
同一个报告中可以写两个同名的度量值吗?试试呗
Power BI在2018年11月更新后,使得我们可以将列和度量值放到一个文件夹中管理,这样我们可以使复杂的报告编写环境变得简洁一些。
陈学谦
2020/04/14
1.2K0
同一个报告中可以写两个同名的度量值吗?试试呗
请写一段PHP代码,确保多个进程同时写入同一个文件成功
请写一段PHP代码,确保多个进程同时写入同一个文件成功 function writeData($path, $mode,$data,$max_retries = 10) { $fp = fopen($path, $mode); $retries = 0; do{ if ($retries > 0) { usleep(rand(1, 10000)); } echo '等待时间:'.$retrie
码农编程进阶笔记
2021/07/20
7350
请写一段PHP代码,确保多个进程同时写入同一个文件成功
Java中的读文件,文件的创建,写文件
大家好,我是 Vic,今天给大家带来Java中的读文件,文件的创建,写文件的概述,希望你们喜欢
达达前端
2019/07/03
1.9K0
Java中的读文件,文件的创建,写文件
python 文件操作读、写、追加的区别
a+模式下,虽然能读取,但指针已到最后,直接read,不会出内容,可以用seek()重置指针
py3study
2020/01/07
1.2K0
用python读Excel文件,同时支持xls和xlsx
解决方法 经过查阅资料,发现xlrd库有更新,官网(https://pypi.org/project/xlrd)显示最新版的xlrd(2.0.1)的确不支持,但老版的xlrd(1.2.0)是支持xlsx的。
ExASIC
2021/11/02
2.1K0
用python读Excel文件,同时支持xls和xlsx
什么?一个核同时执行两个线程?
Hi,好久不见,我是CPU一号车间的阿Q,不认识我的话,可以看看:完了!CPU一味求快出事儿了!
轩辕之风
2020/06/16
8910
什么?一个核同时执行两个线程?
什么?一个核同时执行两个线程?
Hi,好久不见,我是CPU一号车间的阿Q,不认识我的话,可以看看:完了!CPU一味求快出事儿了!
轩辕之风
2020/07/27
6250
什么?一个核同时执行两个线程?
Java中ThreadPoolTaskExecutor同时自定义线程拒绝策略,防止线程太多造成线程池将任务丢弃
1.TransmittableThreadLocal中TtlRunnable使用spring框架中的ThreadPoolTaskExecutor线程池,如果自定义线程池不加名字时会和TtlRunnable使用同一个spring的ThreadPoolTaskExecutor线程池,并会将任务交给ThreadPoolTaskExecutor线程池处理任务。 2.请求任务太多时,连阻塞队列都放不下时,线程池会直接做丢弃,此时应 判断超过阻塞队列内的任务数1半时,将请求线程休眠1s钟,伪代码如下:
IT工作者
2022/05/07
7970
同时具备多线程和多进程安全的写日志工具
接口请浏览:https://github.com/eyjian/mooon/blob/master/mooon/include/mooon/sys/log.h 实现头文件请浏览:https://github.com/eyjian/mooon/blob/master/mooon/include/mooon/sys/safe_logger.h 测试代码:https://github.com/eyjian/mooon/blob/master/mooon/test/sys/test_safe_logger.cpp 使用示例: MYLOG_DEBUG("[%d]MMMMM", 2015); 支持自动添加换行符,默认会自动添加换行符,但可以禁止自动添加换行符。还支持自动在行尾添加点号等功能。 下面是实现:
一见
2018/08/10
8360
[Java 并发]读锁/写锁
之前我们都知道在一个变量被读或者写数据的时候每次只有一个线程可以执行,那么今天我们来看一下读写锁,读写两不误ReadWriteLock。
YanL
2020/04/29
1K0
[Java 并发]读锁/写锁
文件读写api函数是什么_c语言文件的读和写
文件操作API函数详解在VC中,大多数情况对文件的操作都使用系统提供的 API 函数,但有的函数我们不是很熟悉,以下提供一些文件操作 API 函数介绍:
全栈程序员站长
2022/11/17
1.5K0
文件和SOCKET跨线程安全吗?
将一个文件或SOCKET的句柄fd传递给多个线程,进行读、写和Close操作,是否安全了?答案是“否”,这类似于new一个指针后,这个指针传递给多线程是否安全,结果是常常容易造成一个线程使用已经被另一个线程delete的指针。
一见
2018/08/07
1.1K0
让两个OneDrive Business同步同一个文件夹
正常来说,两个OneDrive Business 同步同一个文件夹是不可以的,无法成功设置成同一个文件夹,这时需要用到windows 自带的一个文件链接工具mklink
Erwin
2020/02/14
2.4K0
两个事务并发写,能保证数据唯一吗?
产品经理要求用户和用户之间,电话号码不能重复,为了保证这一点。我们想到了先查一下数据库,再判断一下,如果存在,就退出,否则插入一条数据。类似下面这样的伪代码。
小白debug
2022/06/20
7050
两个事务并发写,能保证数据唯一吗?
点击加载更多

相似问题

线程同时读/写

36

Python :线程同时读/写同一个TCP套接字可以吗?

11

在jquery中防止同时读/写变量

13

同时读/写

30

由两个线程同时读/写一个文件(互斥无济于事)

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文