C# “单一”;锁;还是为IO操作设置单独的读写器锁?

C# “单一”;锁;还是为IO操作设置单独的读写器锁?,c#,.net,multithreading,performance,C#,.net,Multithreading,Performance,我有几个线程写和读不同的文件 是否可以对所有磁盘操作使用单个锁{}(所有受保护区域的变量相同)?所以我没有两个线程同时读写到磁盘上,关于查找 我还听说我也可以在线程上使用读,在线程上使用写,这总是真的吗?为什么?如果您没有从任何线程访问其他线程的代码,那么一个用于同步的对象就足够了,但它会增加等待资源的线程队列。每个资源或资源组使用一个同步对象是更好的选择如果每个线程读取或写入不同的文件,我不明白为什么需要并发 通常,有多个线程访问同一文件(资源)进行读写。 在这种情况下,当一个线程写入文件时,

我有几个线程写和读不同的文件

是否可以对所有磁盘操作使用单个锁{}(所有受保护区域的变量相同)?所以我没有两个线程同时读写到磁盘上,关于查找


我还听说我也可以在线程上使用读,在线程上使用写,这总是真的吗?为什么?

如果您没有从任何线程访问其他线程的代码,那么一个用于同步的对象就足够了,但它会增加等待资源的线程队列。每个资源或资源组使用一个同步对象是更好的选择

如果每个线程读取或写入不同的文件,我不明白为什么需要并发

通常,有多个线程访问同一文件(资源)进行读写。 在这种情况下,当一个线程写入文件时,所有其他线程都必须等待。 这是一个称为“读者-作者”的经典并发问题

您可以在此处找到更多信息:
仅使用一个锁可能会降低应用程序的速度。如果一个线程长时间写入一个文件,那么可能应该允许其他线程读取一些其他文件。
您能否更精确地说明哪些线程如何访问哪些文件?

您的需求似乎有些混乱和变形。一条评论说“线程正在写入同一个文件”,另一条评论说“所有线程同时写入同一个文件集合”

有一些选择:

1) 用一个锁锁定读写操作。这是最简单的方法,但调用线程之间发生争用的可能性最高,因为锁在磁盘操作期间保持

2) 使用每个文件一个读写器锁锁定读写操作-这比(1)要好,因为不同文件上不会出现contentin。对同一文件的读/写操作之间仍可能存在争用

2) 将读/写操作排入一个写入线程的队列。这往往会更多地使用磁盘,因为它在出列和执行写请求时必须在文件之间交换,但会最大限度地减少调用线程中的写争用—它们只需锁定队列以等待将指针推上所需的时间。读取变得很慢,因为调用线程必须等待synchro对象,直到其读取请求完成。写入时争用低,但所有读取时延迟高

3) 与(2)类似,但每个文件使用一个线程。对于多个文件来说,这可能会带来昂贵的内存开销,并且只有在(2)输出文件分布在多个物理磁盘上时才真正有帮助。与(2)类似,低争用和慢速读取

4) 将写操作作为线程池任务排队。我不知道该怎么做——文件上下文必须作为参数传递,对它的访问可能需要锁定——这可能无法有效地工作。与(2)类似,低争用和慢速读取


5) 重新设计应用程序以完全避免此要求?

是的,线程正在写入同一文件。问题的关键在于,如果磁盘一次只能处理一个操作,那么并发操作就没有意义了。因此,基本上,最好将所有磁盘操作锁定为一次只执行一个操作。它们都同时写入同一个文件集合。什么是同步对象或资源组?同步对象是我们锁定的对象,资源组可以是多个数据对象或需要通过锁同步的文件。您是否确认查找有问题?操作系统通常会尽量减少寻道。在I/O之间锁定通常不是一个好主意,因为I/O是长期运行的,不受您的控制。这适用于文件I/O,也适用于网络操作,以及对您无法控制的外部服务的调用。嘿,Martin,基本上我让每个线程读取不同的文件(所有线程读取不同的文件),然后线程处理相应的文件,然后将结果写入另一个文件(所有线程写入同一个文件)。也许值得一提的是,所有线程共享一个用于处理文件的对象,但它们只是从中读取。问题是,我认为既然磁盘操作可以一次完成,那么我应该基本上遵循读取的队列策略(因为文件加载速度比处理速度快)和写入的锁定策略(这样它们就不会冲突了)。也许,我也应该让一次只执行一个读操作或一个写操作。