多线程 C/C++变量无缓存 (Linux)
我使用 2 个 pthread,其中一个线程“通知”另一个线程发生事件,为此有一个变量(普通整数),由第二个线程设置。
这是可行的,但我的问题是,是否有可能第一个(读取)线程没有立即看到更新,这意味着缓存没有直接更新?如果是这样,有没有办法阻止这种行为,例如java中的 volatile 关键字?
(事件发生的频率大约在微秒范围内,因此或多或少需要强制立即更新)。
/编辑:第二个问题:是否可以强制将变量保存在线程 1 所在的核心的缓存中,因为该变量一直在读取它。 ?
I use 2 pthreads, where one thread "notifies" the other one of an event, and for that there is a variable ( normal integer ), which is set by the second thread.
This works, but my question is, is it possible that the update is not seen immediately by the first (reading) thread, meaning the cache is not updated directly? And if so, is there a way to prevent this behaviour, e.g. like the volatile keyword in java?
(the frequency which the event occurs is approximately in microsecond range, so more or less immediate update needs to be enforced).
/edit: 2nd question: is it possible to enforce that the variable is hold in the cache of the core where thread 1 is, since this one is reading it all the time. ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(4)
它可能不会立即被其他处理器看到,但这并不是因为缓存一致性。可见性的最大问题是由于处理器的乱序执行方案或由于编译器在优化时重新排序指令。
为了避免这两个问题,你必须使用 内存 障碍。我相信大多数 pthread 原语都是天然的内存屏障,这意味着您不应期望加载或存储移动到锁定和解锁调用形成的边界之外。 volatile 关键字还可用于禁用某类编译器优化,这些优化在执行无锁算法时很有用,但它不能替代内存屏障。
话虽这么说,我建议您不要手动执行此操作,并且无锁算法存在很多缺陷。把这些头痛的事情留给图书馆作家应该会让你成为一个更快乐的露营者(除非你像我一样并且喜欢头痛:))。所以我最后的建议是忽略我所说的一切并使用弗罗马诺夫或大卫赫夫曼的建议。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在我看来,您应该使用 pthread 条件变量作为信号机制。这可以解决您描述的所有问题。
It sounds to me as though you should be using a pthread condition variable as your signaling mechanism. This takes care of all the issues you describe.