对包含许多并发读者的文件进行原子更新?

时间:2018-02-19 21:21:15

标签: c# .net multithreading filesystems transactional

我需要启用许多并发线程(在一个进程中)以线程安全的方式从文件中读取(随机),而另一个线程正在(随机)写入它。如果我没有弄错的话,FileStream.Flush似乎不是原子的,那么这样的情况怎么解决了呢?我是否需要包裹我的流并在实际流中实现某种ReadersWriter-lock?是否有可能写出无锁的东西?

我已经错过了.NET的解决方案吗?内存映射文件似乎具有相同的限制,没有原子Flush。写入和读取是线程安全的,但我认为多次写入不是原子地刷新的?我不能使用NTFS,所以TxF不是一个选项。

更新:我尝试编写一个自定义Stream-wrapper,将所有写入保留在未提交的缓冲区列表中,然后在所有读取流上以原子方式换出该缓冲区,以便它们立即获得新的版本甚至在它被刷新到底层流之前。但代码变得混乱,我仍然需要锁定在那里,所以我放弃了这个想法。我想我将尝试使用reader-writer-lock更基本的方法。我刚刚注意到FileStream.Lock但它似乎抛出争用异常而不是等待,但我想它更适合跨进程锁定。我只对单进程锁定感兴趣,所以我认为我可以做一些更奇特的解决方案。

更新2 :我在单个流上采用了锁定方法,锁定了读取器和编写器,但是这种方式不会引发争用异常,而是使用旋转等待直到锁被释放。尝试了一些性能测试,而不是拥有多个读取流(并允许并发读取器),但是在多流版本中只看到了非常轻微的性能提升。额外的代码复杂性使它不值得。

0 个答案:

没有答案