簡體   English   中英

對於臨界區 - 何時使用 std::mutex 與 std::atomic_flag?

[英]For critical sections - when to use std::mutex vs std::atomic_flag?

這是使用 STL atomic_flag 的 Spinlock 類的實現,摘自https://www.modernescpp.com/index.php/the-atomic-flag

class Spinlock{
public:
  Spinlock(): flag(ATOMIC_FLAG_INIT) {}

  void lock(){
    while( flag.test_and_set() );
  }

  void unlock(){
    flag.clear();
  }

 private:
   std::atomic_flag flag;
 };

我可以將它用於代碼的任何關鍵部分:

 void myfunction() {
     std::lock_guard<Spinlock> guard(_spinLock);
     ...
 }

修改后的問題:

對於臨界區,似乎我現在有兩個選擇 - std::mutex 和 std::atomic_flag。 什么時候使用一個比另一個更有意義?

std::mutex也可以與conditions結合使用,而你的類不能直接這樣做。 它也可以很好地與作用域鎖配合使用。

除此之外,你的陳述

它更有效率

不是絕對正確的。

while( flag.test_and_set() );

例如,忙等待,這在某些設置中是有效的,而在其他設置中不如指數退避。

問題是:你想達到什么目標,你願意為此做出什么犧牲?

std::atomic_flag不斷請求鎖以訪問臨界區,這使運行它的 CPU 內核保持 100% 忙碌。 如果您有足夠多的內核可以操作,或者沒有多少線程同時在同一臨界區上運行,那么這不會成為問題。 盡管它在用戶空間和內核空間之間節省了昂貴的上下文切換。

另一方面, std::mutex不會使其核心保持忙碌。 使用此解決方案,您無法觀察到任何內核上的顯着負載。 那是因為線程被調度程序掛起,而其他線程在做一些工作。 這意味着線程的狀態被存儲,然后恢復並稍后恢復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM