[英]How to use std::atomic<T>::is_always_lock_free for SFINAE?
[英]Is std::atomic<T> safe with interrupts when std::atomic<T>::is_always_lock_free is false?
在沒有操作系統的嵌入式(ARM)環境中,如果我使用中斷,那么使用std::atomic<T>
是否有可能導致死鎖? 如果是這樣,怎么樣?
通常,任何時刻,控制都可以被中斷以處理中斷。 特別是,如果一個人天真地擁有一個互斥體並希望用它來對變量做一個“安全”,那么可以鎖定它,寫入和解鎖,然后鎖定,讀取和解鎖。 但是如果讀取是在一個中斷中,你可以鎖定,中斷,鎖定=>死鎖。
特別是,我有一個std::atomic<int>
,其中is_always_lock_free
為false
。 我應該擔心僵局嗎? 當我查看生成的程序集時,編寫42
看起來像:
bl __sync_synchronize
mov r3, #42
str r3, [sp, #4]
bl __sync_synchronize
它似乎沒有鎖定。 用於讀取值的asm是類似的。 對於像exchange
這樣的發燒友操作(可能)鎖定?
__sync_synchronize
只是一個完整內存屏障的內置 __sync_synchronize
。 沒有涉及鎖定,因此沒有潛在的死鎖,因為會有互斥和中斷處理程序。
您使用的是什么ARM內核? 上了ARM Cortex-A7下列打印true
兩個。
#include <iostream>
#include <atomic>
int main()
{
std::atomic<int> x;
std::cout << std::boolalpha << x.is_lock_free() << std::endl;
std::cout << std::atomic<int>::is_always_lock_free << std::endl;
}
我希望std::atomic<int>
在沒有鎖的情況下實現,如果不是全部在ARM上,並且當然從你提供的程序集看起來似乎沒有使用鎖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.