首頁 > 後端開發 > C++ > 跨多個執行緒遞增共享整數計數器的最佳方法是:「lock」、「Interlocked」還是「易失性」?

跨多個執行緒遞增共享整數計數器的最佳方法是:「lock」、「Interlocked」還是「易失性」?

Linda Hamilton
發布: 2025-01-27 10:51:13
原創
393 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板