我有一个设备,它使用USB中的两个不同的批量通道发送图像数据和视频帧。
我的工作站处理器缓存有点大,足以容纳大约100个视频帧,没有任何问题,但没有图像数据。
我对图像和视频数据使用相同的缓冲区,缓冲区大约有50个块,一个块大小为1MB。 视频帧快速出现,然后是图像帧。
我的问题是,以下secnario中是否存在内存损坏问题?有处理器缓存知识的人可以帮助我。
volatile
。这可能发生吗?
所以我也将volatile
应用于视频数据写入,这个问题看起来就像消失了。但是我需要做一个报告,所以上面提到的场景有可能发生吗?
答案 0 :(得分:1)
评论是赠品:两个主题,volatile
被误用为线程机制。
两个线程可以在两个CPU内核上运行。虽然内核通常共享内存,但它们通常不共享L1缓存。中级缓存各不相同。因此,在两个CPU内核上取消引用相同的指针可能会产生不同的结果。对于跨线程正确共享的变量,这不是问题;编译器将使用正确的指令。但关键字是正确共享。
在这里,我们遇到了一个小问题,即您已将问题标记为C和C ++,因为在线程之前分叉的两种语言在两种语言中都是标准化的。但是,两个线程机制有意相似,因此编译器对可以(作为扩展)定义C线程和C ++线程如何交互。您需要查阅文档。
将libusb
线程包装在您自己的代码中可能会更容易,这样您就可以在没有线程问题的情况下接收数据,然后从您的代码调度到您控制下的其他线程。
回到你看到的内存损坏:你可能看到的是一个线程正在写出它的内存视图,结果证明它的缓存中是陈旧的数据。如果您使用类似互斥锁的东西,则会记录这些陈旧的数据并同步缓存。