多线程同时读写文件应注意什么?如何解决读写冲突?请各位高手、大虾指点一下。

时间:2021-08-03 17:38:15
多线程同时读写文件,都调用相同的公共读写函数进行(写的时候有时需要重写文件。)我在writethread.excute中加了临界,可是还是总出现‘i/o error’或‘read beyond of file’错误。
怎样避免出现冲突哪?

谢谢!

9 个解决方案

#1


代码贴出来

#2


......
uses unit2;//unit2声明公共读写函数;writetofile,readfromfile...
......
TwriteThread=class(TThread)
  protected
     procedure execute; override;

  public
     data:String;
  end;

procedure TWriteThread.execute;
begin
 enterCriticalSection(Csect);
     writetofile(Data);   
 leaveCriticalSection(Csect);
end;
读从别的form直接进行。
读写还用了使用公共变量标志,ISwrite,Isread。操作前先判断一下,是否在读或写。

#3


可以试试锁定文件
var
  FileLock:TCriticalSection;
begin
  FileLock:=TCriticalSection.Create;
  FileLock.Acquire;//锁定文件
  FileLock.Release;//释放文件锁定
end;

#4


使用ShanShiMin(Delphi+C#=我的最爱) 的方法后,同时还要使用阻塞,通道等技术防制同时对文件进行操作!

#5


delphi 和 windows 都提供了文件读写函数。
1:
assignfile();
reset();
rewrite();
blockwrite()
BlockRead();
closefile();
2:
filecreate();
fileopen();
filewrite();
fielread();
filecolse();
3:
createfile();
ReadFile();
writefile();
.
.
.
对于多线程读写二进制流来说,用哪组比较好?

#6


to  ntlan(清茶书香)  和 ShanShiMin(Delphi+C#=我的最爱) :

  用异步I/O能实现吗?应怎样实现?

#7


请高手指点。

一旦解决就结贴。

#8


可以这样解决
单独用一个线程写文件,别的线程需要写文件的时候,把数据通过线程消息发给这个线程。

#9


在有多线程共享同一个全局变量时,访问变量是要加临界的。

#1


代码贴出来

#2


......
uses unit2;//unit2声明公共读写函数;writetofile,readfromfile...
......
TwriteThread=class(TThread)
  protected
     procedure execute; override;

  public
     data:String;
  end;

procedure TWriteThread.execute;
begin
 enterCriticalSection(Csect);
     writetofile(Data);   
 leaveCriticalSection(Csect);
end;
读从别的form直接进行。
读写还用了使用公共变量标志,ISwrite,Isread。操作前先判断一下,是否在读或写。

#3


可以试试锁定文件
var
  FileLock:TCriticalSection;
begin
  FileLock:=TCriticalSection.Create;
  FileLock.Acquire;//锁定文件
  FileLock.Release;//释放文件锁定
end;

#4


使用ShanShiMin(Delphi+C#=我的最爱) 的方法后,同时还要使用阻塞,通道等技术防制同时对文件进行操作!

#5


delphi 和 windows 都提供了文件读写函数。
1:
assignfile();
reset();
rewrite();
blockwrite()
BlockRead();
closefile();
2:
filecreate();
fileopen();
filewrite();
fielread();
filecolse();
3:
createfile();
ReadFile();
writefile();
.
.
.
对于多线程读写二进制流来说,用哪组比较好?

#6


to  ntlan(清茶书香)  和 ShanShiMin(Delphi+C#=我的最爱) :

  用异步I/O能实现吗?应怎样实现?

#7


请高手指点。

一旦解决就结贴。

#8


可以这样解决
单独用一个线程写文件,别的线程需要写文件的时候,把数据通过线程消息发给这个线程。

#9


在有多线程共享同一个全局变量时,访问变量是要加临界的。