C#多线程写文件的问题

kissstefani 2013-10-25 10:44:07
我遇到问题是这样的:比如我有5个线程如果同时写不同文件名的文件,肯定是没有问题的,但如果有2个同名就可能报错,说文件正在访问。我如何实现:发现线程A正在写同名的文件,另一个B线程就JOIN等待,而其它要写不同名的文件的CDEF不影响,仍写自己的,A线程写完后B线程判断文件有了就不写执行后面的逻辑。

你说LOCK,我要是LOCK这段写文件的代码,那CDEF都得等着,多线程就没意义了。我就是针对同名的文件怎么LOCK?或者我这个想法就不正规?
...全文
758 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
毛员外 2014-09-11
  • 打赏
  • 举报
回复
写多线程,首先得确定硬件环境吧!比如你能运行时获取CPU内核数 ,磁盘磁头数,就是同时可以有几个磁头工作,才能决定线程并行度呀,要不写出来的东东就不可靠了
zhenghao1977 2014-04-18
  • 打赏
  • 举报
回复
维护一个正在被占用的文件的 字典
衣舞晨风 2014-04-18
  • 打赏
  • 举报
回复
引用 7 楼 liuqian4243 的回复:
能用数据库的话, 每写文件前,数据表插入记录,标记开始写空上文件了,文件写好,再更新下记录,标记成功写好这个文件了. (万一写时出错,就更新为写失败) 其他线程,每次写文件前,都要读库,看是否已有同名文件在写,或者已写成功,后面处理,就好说了.
这个不错
jy251 2014-04-16
  • 打赏
  • 举报
回复
引用 11 楼 kissstefani 的回复:
操作系统有一个叫时间片轮转的东西,开多个线程可以争取到更多的读写时间,更多的资源,会更快一些。
扯淡的逻辑,IO跟CPU有很大的关系?
hudsonhuang 2014-04-16
  • 打赏
  • 举报
回复
引用 11 楼 kissstefani 的回复:
操作系统有一个叫时间片轮转的东西,开多个线程可以争取到更多的读写时间,更多的资源,会更快一些。
你查一下异步IO吧。。。。 开多线程,线程切换花费的资源更多。。。。
hudsonhuang 2014-04-16
  • 打赏
  • 举报
回复
引用 2 楼 kissstefani 的回复:
[quote=引用 1 楼 caozhy 的回复:] 让一个线程去写文件,这个线程维护一个命令队列,其它线程丢命令给它。
我是想ABCDE多个线程可以同时写文件,一个线程就慢了。[/quote] -_- 你是怎么写啊?打开文件,写,关闭文件? 你确定这样会快? 呵呵。。。。
红色深海 2014-04-16
  • 打赏
  • 举报
回复
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.IO; namespace Thread { class Program { const int T = 10; //总线程数 const int LOCK = 1000; //申请读写时间 const int SLEEP = 100; //线程挂起时间 static FileStream fs = new FileStream("E:\\test.txt", FileMode.OpenOrCreate); static Thread[] threadTest = new Thread[T]; static ReaderWriterLock readWriteLock = new ReaderWriterLock(); static void Main(string[] args) { Initial(); for (int i = 0; i < T; i++) { threadTest[i].Start(); } for (int i = 0; i < T; i++) if (threadTest[i].IsAlive) threadTest[i].Abort(); Pause(); } static void Pause() { Console.WriteLine("Press any key to continue..."); Console.ReadKey(true); } static void Initial() //随机初始化线程读写状态 { for (int i = 0; i < T; i++) { Random rd = new Random(); int j = rd.Next(2); if (j == 0) { Console.WriteLine("Thread" + i.ToString() + " is to read."); threadTest[i] = new Thread(new ThreadStart(ReadTest)); } else { Console.WriteLine("Thread" + i.ToString() + " is to write."); threadTest[i] = new Thread(new ThreadStart(WriteTest)); } } } static void ReadTest() //读取文件 { try { readWriteLock.AcquireReaderLock(LOCK); StreamReader rd = new StreamReader(fs); Console.WriteLine("Reading..."); Thread.Sleep(SLEEP); rd.Close(); readWriteLock.ReleaseReaderLock(); } catch (Exception ee) { Console.WriteLine(ee.Message); } } static void WriteTest() //写入文件 { try { readWriteLock.AcquireWriterLock(LOCK); StreamWriter wr = new StreamWriter(fs); Console.WriteLine("Writing..."); Thread.Sleep(SLEEP); wr.Close(); readWriteLock.ReleaseWriterLock(); } catch (Exception ee) { Console.WriteLine(ee.Message); } } }
风之影子 2013-10-28
  • 打赏
  • 举报
回复
启用一个维护所有写文件线程的线程。专门进行管理。
卧_槽 2013-10-28
  • 打赏
  • 举报
回复
引用 2 楼 kissstefani 的回复:
[quote=引用 1 楼 caozhy 的回复:] 让一个线程去写文件,这个线程维护一个命令队列,其它线程丢命令给它。
我是想ABCDE多个线程可以同时写文件,一个线程就慢了。[/quote] 如果你有一个软驱,一个可以用的软盘,你会对磁盘读写更有感性的认识。
卧_槽 2013-10-28
  • 打赏
  • 举报
回复
引用 10 楼 WM_JAWIN 的回复:
多线程写文件有意义?磁头只一个。到了最底层还是要等。 打开文件时,参数弄个Shared RW就可以啦
人家超极本都是固态硬盘,木有磁头的。
卧_槽 2013-10-28
  • 打赏
  • 举报
回复
引用 2 楼 kissstefani 的回复:
[quote=引用 1 楼 caozhy 的回复:] 让一个线程去写文件,这个线程维护一个命令队列,其它线程丢命令给它。
我是想ABCDE多个线程可以同时写文件,一个线程就慢了。[/quote] 这个问题上次几个大头吵了一架,具体帖子忘记了。总之得出的结论是读写文件的速度和磁盘本身以及cpu核心数相关,多线程并不能有效提高效率。小伙子不要纠结于此。
cheng2005 2013-10-28
  • 打赏
  • 举报
回复
引用 11 楼 kissstefani 的回复:
操作系统有一个叫时间片轮转的东西,开多个线程可以争取到更多的读写时间,更多的资源,会更快一些。
如果你学习过操作系统应该知道,所谓的时间片轮转是指CPU的时间片轮转。 估计你也学过计算机组成原理,那么应该知道硬盘IO跟CPU是没什么关系的。
kissstefani 2013-10-28
  • 打赏
  • 举报
回复
操作系统有一个叫时间片轮转的东西,开多个线程可以争取到更多的读写时间,更多的资源,会更快一些。
threenewbee 2013-10-25
  • 打赏
  • 举报
回复
引用 2 楼 kissstefani 的回复:
[quote=引用 1 楼 caozhy 的回复:] 让一个线程去写文件,这个线程维护一个命令队列,其它线程丢命令给它。
我是想ABCDE多个线程可以同时写文件,一个线程就慢了。[/quote] 多线程写文件可以更快?你是怎么想到这个妙招的?
  • 打赏
  • 举报
回复
你可去用Task,支持一个任务完成时再去自动启动另一个任务。如果有重名的情况,你就这样处理。
PaulyJiang 2013-10-25
  • 打赏
  • 举报
回复
B发现自己需的资源比如FileA被线程A所占用,这个时候应该是B将自己变为等待状态,待A用完FileA来唤醒B(或者B过一段时间查看下FileA是否有人在用,如果没有就使用,如果有继续等待)。其他线程不受影响的。
kissstefani 2013-10-25
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
让一个线程去写文件,这个线程维护一个命令队列,其它线程丢命令给它。
我是想ABCDE多个线程可以同时写文件,一个线程就慢了。
threenewbee 2013-10-25
  • 打赏
  • 举报
回复
让一个线程去写文件,这个线程维护一个命令队列,其它线程丢命令给它。
WM_JAWIN 2013-10-25
  • 打赏
  • 举报
回复
多线程写文件有意义?磁头只一个。到了最底层还是要等。 打开文件时,参数弄个Shared RW就可以啦
chinaheart88 2013-10-25
  • 打赏
  • 举报
回复
同步77777777777
加载更多回复(3)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧