C++ 线程1读取文件,而线程2写入同一文件

C++ 线程1读取文件,而线程2写入同一文件,c++,windows,multithreading,file,C++,Windows,Multithreading,File,线程1(T1)使用 FILE *MyFile = tmpfile(); 线程2(T2)然后开始写入文件。线程2正在写入时,线程1偶尔会从文件中读取 我将其设置为,当T1读取时,T2暂时挂起,但是,由于T1只读取文件T2的一部分,所以T2不会写入(文件是按顺序写入的),我想知道是否有必要挂起T2。我知道,如果文件被固定大小的数组/向量替换,这就可以了。只是想知道光盘和内存有什么不同 编辑 写入是使用fseek和fwrite完成的。读取是使用fseek和fread完成的。我认为这是一个给定的,但可

线程1(T1)使用

FILE *MyFile = tmpfile();
线程2(T2)然后开始写入文件。线程2正在写入时,线程1偶尔会从文件中读取

我将其设置为,当T1读取时,T2暂时挂起,但是,由于T1只读取文件T2的一部分,所以T2不会写入(文件是按顺序写入的),我想知道是否有必要挂起T2。我知道,如果文件被固定大小的数组/向量替换,这就可以了。只是想知道光盘和内存有什么不同

编辑


写入是使用fseek和fwrite完成的。读取是使用fseek和fread完成的。我认为这是一个给定的,但可能不是从一些评论。我想,如果T1 fseek到位置X的时间与T2 fseek到位置Y的时间相同,那么谁知道下一次读取或写入将从何处开始。将查看管道,感谢您的帮助。

在处理单个线程时,在文件上混合读写甚至都不安全。从fopen的手册页:

读/写流上的读和写可以以任何顺序混合。请注意,ANSI C 要求文件定位功能介入输出和输入之间,除非输入 操作遇到文件结尾。(如果不满足此条件,则允许读取 返回除最近写入之外的其他写入的结果。)因此,这是一种良好的做法(并且 事实上,在Linux下,有时需要将fseek(3)或fgetpos(3)操作放在 在这种流上的写和读操作。此操作可能是明显的无操作(如 fseek(…,0L,SEEK_CUR)要求同步它的副作用)


因此,不要假设读写操作神奇地同步,并使用互斥锁保护对文件的访问。

当第二个线程在线程1监视内存时修改内存时,即使在线程之间共享内存也可能导致未定义的行为。线程1可能会看到“半状态”(即,在线程2仍忙于将内容写入内存时读取)。你需要一个互斥锁来确保一次只有一个线程访问它。谢谢你的回复。我已将问题编辑为固定大小数组/向量。对于文件,是否可以同时读取和写入?磁盘操作系统是否会接收诸如写入、写入、写入、读取、写入等请求,并按它们到达的顺序处理它们?文件读/写与磁盘I/O有关,就像堆栈/堆与内存有关。T1和T2可以通过使用锁相互排斥。这不是个好主意。文件很难作为IPC的一种形式使用。如果需要数据库,请使用数据库。如果需要传递数据,请使用设计用于传递数据的工具,如管道。不是设计用来存储数据的人。但是如果他打开文件两次呢?我可以看到生产者和消费者都使用共享标志打开文件。但我同意安德鲁·亨勒的说法,他说最好用烟斗。OP正在使用Windows,这样他甚至可以在消息模式下打开管道,这样他甚至不必将传入字节流拆分为单独的消息…这更糟糕,因为这样你就有了两个带有单独缓冲区的文件流。一个文件中的写入不会显示在另一个文件中,除非它被刷新到磁盘。是的,管道更适合于线程之间的通信。