簡體   English   中英

是std :: atomic <T> 當std :: atomic時中斷安全 <T> :: is_always_lock_free是假的?

[英]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_freefalse 我應該擔心僵局嗎? 當我查看生成的程序集時,編寫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.

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