[英]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.