1

在我的应用程序中,我不断将数据写入file1并将其刷新到设备。在另一个线程中,我正在从file1读取数据并将其写入file2

每次我在 file1 上执行fwrite + fflush时,我都会向另一个线程发出信号以开始从中读取。另一个线程从file1 中读取数据并将其转储到file2 中。很简单的逻辑。此外,每隔几分钟,我就会回到 file1 的开头并开始覆盖旧数据。

现在我的问题是,一旦我开始覆盖file1中的数据,读入 file2 的数据有时是旧数据(即在前一次迭代中写入的数据),即使写入器线程已经发出信号表示它写入了新数据(并刷新了它)。

我正在 [C + linux + arm platfrom] 上写入和读取固态驱动器(128 GB SAMSUNG 470 系列,如果有帮助的话)。我觉得处理器缓存有问题。也许写入进入缓存,读取器线程的读取来自闪存,因此是陈旧的数据。

这里的问题是,如果 SSD 使用 NTFS 格式化,则会出现此问题。如果我用 ext3 格式化它,问题就消失了。不幸的是,NTFS 是一项硬性要求。另一个有趣的观察是,如果我有两个阅读器线程,它们都会在不同的时刻获得陈旧的数据。

禁用 SSD 写入缓存(使用hdparm -W0 /dev/sda1)后的事件,我遇到了与 NTFS 相同的问题。一个多星期以来,我一直坚持这一点。

知道发生了什么,为什么会这样?

任何帮助都将物超所值……

编辑原来NTFS驱动程序不喜欢我通过倒回文件指针来覆盖文件。这是众所周知的事情吗?

4

1 回答 1

0

好的,所以我自己发现了这个问题(而且这种情况很少发生!!!)。

我发现 C 库缓冲(fread/fwrite)存在问题。所以我在每个 fread() 之前做 fflush()。这解决了我的问题(我不知道驱动程序到底出了什么问题,但我假设从文件的同一位置读取时,C 库 I/O 函数的“读取”缓冲存在一些问题第二次)。

感谢@Asad Rasheed 和@jrtipton 的投入:)

于 2011-10-10T12:55:58.540 回答