【发布时间】:2017-07-01 01:18:33
【问题描述】:
我有一个设备,它使用 USB 中的两个不同的批量通道发送图像数据和视频帧。
我的工作站处理器缓存有点大,足以容纳大约 100 个视频帧而没有任何问题,但不能容纳图像数据。
我对图像和视频数据使用相同的缓冲区,该缓冲区有大约 50 个块,一个块大小为 1MB。 视频帧来得很快,然后是图像帧。
我的问题是,以下 secnario 中是否存在内存损坏问题?有处理器缓存知识的人可以帮助我。
- 由于视频帧很小,内存缓冲区中写入视频帧的页面几乎都在缓存中。由于视频数据以流的形式出现,因此它永远不会被刷新。
- 但是当图像数据到来时,内存缓冲区的大面积将被使用,然后视频内存页面将被刷新。但计划刷新但仍未写入物理内存。
- 现在图像数据已写入内存,我在那里使用了
volatile。 - 并且在图像数据写入后刷新这些数据时,缓存刷新会损坏这些数据。
这会发生吗?
所以我也将volatile 应用于视频数据写入,这个问题看起来就消失了。但是我需要做一个报告,那么上面提到的这种情况有可能发生吗?
【问题讨论】:
-
不确定我是否完全理解您的问题,但我假设您混淆了两个完全不相关的概念:
volatile修饰符无法操作 CPU 缓存。volatile只是说数据可能会在 CPU 控制之外被修改。如果添加volatile可以解决问题,这仅意味着您的编译器足够聪明,可以优化代码,如果数据仅由 CPU 处理,则这些代码似乎不必要/冗余。 -
是的,它来自外部,来自另一个线程,但是 libusb,一个用户模式线程。
-
让我说得更清楚一点,如果线程错误通过添加
volatile消失,那只是巧合。你不能依赖它,写下一行代码可能会再次崩溃。
标签: c++ c caching memory volatile