首页 > 后端开发 > C++ > 跨多个线程递增共享整数计数器的最佳方法是:'lock”、'Interlocked”还是'易失性”?

跨多个线程递增共享整数计数器的最佳方法是:'lock”、'Interlocked”还是'易失性”?

Linda Hamilton
发布: 2025-01-27 10:51:13
原创
422 人浏览过

Which is the Optimal Approach for Incrementing a Shared Integer Counter Across Multiple Threads: `lock`, `Interlocked`, or `volatile`?

Interlocked 操作、lock 语句和 volatile 字段的比较

问题:

假设一个类包含一个公共 int 类型的计数器字段,该字段被多个线程访问,并且仅对其进行增量或减量操作。哪种方法是增量此字段的最佳方法,为什么?

  • lock(this.locker) this.counter ;
  • Interlocked.Increment(ref this.counter);
  • 将计数器的访问修饰符更改为 public volatile

答案:

最差(不可行):

  • 将计数器的访问修饰符更改为 public volatile

仅使用 volatile 字段不能保证线程安全。虽然 volatile 确保多个 CPU 同时访问相同的数据,但它不能防止读取和写入操作的交错,这可能导致错误。

次优:

  • lock(this.locker) this.counter ;

lock 语句通过防止其他线程执行修改受保护字段的代码来提供线程安全。但是,锁定相对较慢,并且可能不必要地阻塞其他线程。

最佳:

  • Interlocked.Increment(ref this.counter);

Interlocked 操作是原子且线程安全的,为修改共享数据提供了最有效和可靠的方法。它们以一次性操作执行读取、增量和写入操作,无需锁定。

Interlocked 操作与 volatile 字段的比较:

Interlocked 操作在执行的指令周围应用完整的栅栏,防止多个 CPU 重新排序。volatile 字段仅在其操作周围放置半栅栏,因此它们不会防止重新排序。因此,对于共享数据的并发修改,应使用 Interlocked 操作;而对于写入器从不读取且读取器从不写入原子值的场景,volatile 字段则适用。

以上是跨多个线程递增共享整数计数器的最佳方法是:'lock”、'Interlocked”还是'易失性”?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板