3

我有几个线程在编写和读取不同的文件。

可以对所有磁盘操作使用单个锁{}(所有受保护区域的相同变量)吗?所以我没有两个线程同时读取和写入磁盘到关于搜索?

我还听说我也可以在线程上用于读取和另一个用于写入,这总是真的吗?为什么?

4

4 回答 4

2

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

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

您可以在此处找到更多信息: http ://en.wikipedia.org/wiki/Readers-writers_problem

于 2012-04-24T05:27:26.433 回答
1

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

于 2012-04-24T05:22:00.370 回答
0

只使用一把锁可能会减慢您的应用程序。如果一个线程长时间写入文件,也许应该允许其他线程读取一些其他文件。您能否更准确地了解哪些线程如何访问哪些文件?

于 2012-04-24T05:43:16.333 回答
0

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

有一些选择:

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

2) 每个文件使用一个读写器锁来锁定读取和写入 - 这比 (1) 更好,因为不同文件上的内容不会发生。对同一文件的读/写之间仍然可能存在争用。

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

3) 与 (2) 类似,但每个文件使用一个线程。对于多个文件,这可能会在内存方面变得昂贵,并且只有在输出文件分布在多个物理磁盘上时才真正有助于 (2)。像 (2) 一样,低争用和慢读。

4) 将写入作为线程池任务排队。我不确定如何准确地做到这一点 - 文件上下文必须作为参数传递并且对它的访问可能需要锁定 - 这可能无法有效工作。像 (2) 一样,低争用和慢读。

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

于 2012-04-24T08:03:12.413 回答