如果所有线程都写到不同的位置,多个线程可以同时写到一个文件吗?
Can multiple threads write into a file simultaneously, if all the threads are writing to different locations?
我正在用c++编写代码。我能遇到任何比赛条件或赛区故障吗?
从底层系统(对于我所知道的所有系统)的角度来看,这样做没有问题。但是,通常需要有完全独立的文件描述符/句柄。这是因为文件描述符维护状态,例如当前文件位置。
您还需要检查您正在使用的文件系统的特定c++接口的线程安全性。除了底层文件系统的线程安全之外,这也是必需的。
您还应该考虑线程I/O会变慢的可能性。系统可能必须序列化对总线的访问。通过生产者/消费者管道提供的重叠I/O或专用I/O线程可以获得更好的性能。
另一个解决方案是使用内存映射文件,这取决于文件的大小和您正在运行的系统。将文件映射到虚拟内存。这将使您可以直接访问文件,就像它是一块内存一样。这样,任何数量的线程都可以简单地写入内存区域,随后调用将映射刷新到磁盘(取决于您对内存映射的配置)将简单地将数据存储在磁盘上。
请注意,由于32位平台上的寻址限制,您不可能映射任何大于2-3 GB的文件,这取决于体系结构和可用于进行虚拟内存寻址的实际位数。大多数64位系统都有48位或更多的可用空间用于此任务,允许您至少映射256 TB,我认为这已经足够了。
看情况。文件不是它们的句柄,流也不是文件。这三个不同的概念必须清楚。
现在,操作系统可以多次打开文件,返回不同的句柄,每个句柄都有自己的"位置指针"。如果文件以"共享模式"打开,既可以读也可以写,你可以在你想要的地方寻找句柄,并按你喜欢的方式读/写。你不重写取决于你自己。系统为整个文件或部分文件授予操作的顺序性(但需要有关操作系统的更多信息)
如果每个句柄都连接到不同的流,则每个流将独立于其他流进行写操作。但是在这种情况下,存在"缓冲"的复杂性(写入可以延迟,读取可以预期;并且可以比您要求的时间更长:确保通过适当的刷新来适当地管理最终的重叠)
当然可以。竞争条件可能会发生,这取决于您如何编写实际代码(即使用该文件)。此外,如果缓冲IO,如果缓冲区域重叠,可能会出现奇怪的事情。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 在另一个线程中调用luaL_error会引发qWarning
- 全局变量 多读取器 一个写入器多线程安全?
- C++一个线程如何正确通信其任务已完成?
- 最佳做法是从另一个线程访问 qml 中的Q_PROPERTY
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 是否可以创建一个从不同类调用函数的线程?
- 如何制作一个只能在一个线程上同时执行的函数?
- 结束另一个线程中使用的对象的生存期
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 一个线程等待多个线程事件
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- C 两个线程一个用于输入,一个用于输出
- 2个线程 - 一个带有OpenGL窗口的线程,第二个带有WXWIDGETS的窗口
- 每个线程一个类实例,C++11
- 多线程-一个作家和一个读者-我们需要使用储物柜吗
- Cuda如何从全局函数运行多个线程?一个运行多个线程的内核