簡體   English   中英

std :: atomic_flag沒有提供加載或存儲操作的任何缺點? (旋轉鎖定示例)

[英]Any disadvantages for std::atomic_flag not providing load or store operations? (Spin-lock example)

std::atomic_flagstd::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.

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