【发布时间】:2014-05-12 03:12:43
【问题描述】:
在我的应用程序中,我不断将数据写入 file1 并将其刷新到设备。在另一个线程中,我正在从 file1 读取数据并将其写入 file2。
每次我对 file1 执行 fwrite + fflush 时,我都会向另一个线程发出信号以开始读取它。另一个线程从file1 中读取数据并将其转储到file2 中。很简单的逻辑。此外,每隔几分钟,我就会回到 file1 的开头并开始覆盖旧数据。
现在我的问题是,一旦我开始覆盖 file1 中的数据,读入 file2 的数据有时是旧数据(即在上一次迭代中写入的数据)甚至尽管写入器线程已经发出信号,它写入了新数据(并刷新了它)。
我正在 [C + linux + arm 平台] 上写入和读取固态驱动器(128 GB SAMSUNG 470 系列,如果有帮助的话)。我觉得处理器缓存有问题。也许 write 进入缓存,而 reader 线程的 read 来自闪存,因此是陈旧的数据。
这里的问题是,如果 SSD 使用 NTFS 格式化,则会出现此问题。如果我用 ext3 格式化它,问题就消失了。不幸的是,NTFS 是一项硬性要求。另一个有趣的观察是,如果我有两个阅读器线程,它们都会在不同的时刻获得陈旧的数据。
禁用 SSD 写入缓存后的事件(使用 hdparm -W0 /dev/sda1),我遇到了与 NTFS 相同的问题。一个多星期以来,我一直坚持这一点。
知道发生了什么,为什么会这样?
任何帮助都将物超所值......
编辑 原来 NTFS 驱动程序不喜欢我通过倒回文件指针来覆盖文件。这是众所周知的事情吗?
【问题讨论】:
-
您是否尝试在线程一中以覆盖模式重新打开文件?另外,你如何在线程 2 中从 file1 读取数据,你是否重新打开了文件?
-
您使用的是 ntfs-3g 还是内核中的 ntfs 驱动程序?
-
@Asad:不,我不重新打开文件,我只是倒带(fp)。我会试试你的建议。 @Bdonlan:我使用 tuxera 嵌入式 ntfs 驱动程序(商业)
-
我不熟悉 Tuxera 驱动程序,但这听起来像是您正在使用的特定 NTFS 实现的错误。 SSD问题是一个暗示。如果这是在 Microsoft NTFS 驱动程序中,我们会密切关注。
标签: linux caching filesystems ntfs ext3