在我的应用程序中,我不断将数据写入 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驱动程序不喜欢通过倒带文件指针来覆盖文件。这是一个众所周知的事情吗?
答案 0 :(得分:0)
好的,所以我自己发现了这个问题(这种情况很少发生!!!)。
我发现C库缓冲存在问题(fread / fwrite)。所以我在每个fread()之前做fflush()。这解决了我的问题(我不知道驱动程序到底出了什么问题,但我假设从文件的同一位置读取时,C库I / O函数的“读取”缓存存在一些问题第二次)。
感谢@Asad Rasheed和@jrtipton的投入:)