![](/img/trans.png)
[英]Spin lock with std::atomic_flag - put the thread to sleep or not?
[英]Any disadvantages for std::atomic_flag not providing load or store operations? (Spin-lock example)
將std::atomic_flag
與std::atomic_bool
(又名std::atomic<bool>
)進行比較,在我看來std::atomic_flag
只是有一個更簡單的接口。 它僅提供測試+設置和清除標志,而std::atomic_bool
也為多個運算符提供重載。
我的一個問題是術語:“裝載或存儲操作”是什么意思? 這是否意味着不可能隨意讀取和修改std::atomic_flag
的值?
此外,我想知道,當用於自旋鎖時, std::atomic_bool
會更快嗎? 在我看來, std::atomic_flag
總是必須在自旋鎖期間讀取和寫入:
while (my_atomic_flag.test_and_set()); // spin-lock
而std::atomic_bool
只需要執行讀操作(假設原子bool是無鎖實現的):
while (my_atomic_bool); // spin-lock
std::atomic_flag
是否比std::atomic_flag
更有效率,還是std::atomic_bool
呢? 什么應該用於旋轉鎖定?
“裝載或存儲操作”是什么意思? 這是否意味着不可能隨意讀取和修改std :: atomic_flag的值?
std::atomic_flag
不支持正常的存儲/加載操作。
它是一種僅修改類型; 即。 如果不執行修改操作,則無法讀取std::atomic_flag
對象。
通常, std::atomic_flag
用作其他操作的構建塊。 它的界面非常簡單; 它是唯一保證無原子鎖定操作的原子類型。 它支持的操作是:
std::atomic_flag::clear()
std::atomic_flag::test_and_set()
有了它,你可以輕松地建立自己的螺旋鎖(雖然通常不推薦):
class my_spinlock {
std::atomic_flag flag = ATOMIC_FLAG_INIT;
public:
void lock()
{
while(flag.test_and_set());
}
void unlock()
{
flag.clear();
}
};
此外,我想知道,當用於自旋鎖時,std :: atomic_bool會更快嗎? 在我看來,std :: atomic_flag總是必須在自旋鎖期間讀取和寫入
嗯,問題是,一個自旋鎖總是必須在獲取鎖時修改它的狀態。 你根本不能不告訴別人就鎖定。
基於std::atomic<bool>
lock()
實現看起來非常相似:
while (flag.exchange(true));
基於std::atomic_flag
的自旋鎖是否更快?
在我的平台上,編譯器為這兩種類型發出相同的程序集,所以我會非常驚訝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.