三大类库(二)之文件处理问题
一、分析
背景
当我们有多个线程如果同时写不同文件名的文件,不会发生出现问题,但如果出现有两个或者多个文件同名就可能出现Bug,说文件正在访问。假设线程A正在写同名的文件,另一个B线程就Join等待,而其它要写不同名的文件不影响,仍写自己的,A线程写完后B线程判断文件不被占用就不写执行后面的逻辑。
B发现自己需要的资源比如File1被线程A所占用,这个时候应该是线程B将自己变为等待状态,待A用完File1来唤醒B(或者B过一段时间查看下File1是否有人在用,如果没有就使用,如果有继续等待)。其他线程不受影响。
在Linux系统中
存在程序的并发执行:并发执行是为了增强计算机系统的处理能力和提高资源利用率所采取的一种同时操作技术。程序的并发执行可进一步分为两种第一种是多道程序系统的程序执行环境的变化所引起的多道程序的并发执行。
一组在逻辑上互相独立的程序或程序段在执行过程中其执行时间在客观上互相重叠,即一个程序段的执行尚未结束,另一个程序段的执行已经开始的执行方式。
在其进程中也存在其等待状态
进程因发生某事件(如请求I/O、申请缓冲空间等)而暂停执行时的状态,称为等待状态。通常将处于等待状态的进程排成一个队列,称为等待队列。在有的系统中,按等待原因的不同而将处于等待状态的进程排成多个队列。下图是进程转换图:
二、假设
我们定义一个统一操作文件的操作类,里面有对文件操作所有的相关方法。且这些方法,都是静态方法,这些方法均做好互斥,确保多线程操作时,始终只有一个方法正在操作文件,而其他准备操作文件的地方等待。
三、结论
出现这样问题的原因正如提示说明那般,不难推算出在频繁的操作过程中,可能有一个环节没有将这个文件的使用权交出来,在使用File.Create(filepath)或者File.Open(filepath,Filemodle.open,FileAccess.Read)或者通过实例化FileInfo的示例,来Open文件的时候,其都是有一个FileStream的返回值的,无论是写入内容,或者是关闭,都需要显示地进行一下操作方可以完全关闭对文件的控制,下面提供两种操作,如下:
(1)、
1 FileStream fs = File.Create(AccFilePath);
2 fs.Close();
(2)、
1 using (FileStream f = new FileStream(file, FileMode.Open, FileAccess.Read)) 2 3 { 4 byte[] by=new byte[1024*1024];//缓冲大小1M 5 into count=0; 6 using (FileStream f1 = new FileStream(newfilePath, FileMode.Create, FileAccess.Write)) 7 { 8 //循环写入newfilePath中 9 } 10 11 12 }