我正在尝试使用多个线程写入大文件的不同部分,就像分段文件下载器一样。
我的问题是,这样做的安全方法是什么?我是否打开文件进行编写,创建我的线程,将Stream对象传递给每个线程?我不希望发生错误,因为多个线程可能同时访问同一个对象。
顺便说一下,这是C#。
答案 0 :(得分:14)
我个人建议您在多个线程中获取数据,但实际上从单个线程写入。这种方式可能会相当简单。您可以使用生产者/消费者队列(在.NET 4中真正容易),然后每个生产者将提供“索引,数据”对。然后,消费者线程可以依次寻找,写入,搜索,写入等。
答案 1 :(得分:1)
如果这是Linux编程,我建议您查看pwrite()
命令,该命令将缓冲区写入给定偏移量的文件。粗略搜索C#文档并没有出现这样的情况。有谁知道是否存在类似的功能?
答案 2 :(得分:1)
虽然有人可能能够打开指向同一文件的多个流,并在每个线程中使用不同的流,但我会在没有某些理由的情况下使用单个线程进行写作的建议。即使两个或多个线程可以安全地同时写入同一个文件,这并不意味着它是个好主意。让统一线程尝试以合理的顺序对写入进行排序以避免大量随机搜索可能会有所帮助;这样做的性能优势将取决于操作系统如何有效地缓存和调度随机写入。如果事实证明操作系统做得不错,请不要疯狂地优化这些事情,但如果操作系统默认行为结果表现不佳,请准备好添加一些优化。