[英]Functions for performing atomic operations
C運行時庫或任何其他實用程序庫是否支持執行原子操作(例如整數的增/減)等功能?
如果是,那么使用這些功能可以使所有操作變為原子操作?
使用此類功能是否比諸如互斥鎖等常規同步原語更有利?
操作系統:Windows,Linux,Solaris和VxWorks
C庫沒有任何庫。
在Linux上,gcc提供了一些-查找__sync_fetch_and_add
, __sync_fetch_and_sub
等等。
對於Windows,請查找InterlockedIncrement
, InterlockedDecrement``,
InterlockedExchange`等。 如果您在Windows上使用gcc,我想它也具有與Linux上相同的內置功能(盡管我尚未驗證)。
在Solaris上,這取決於。 據推測,如果您使用gcc,它可能(再次)具有與Linux下相同的內置函數。 否則,到處都是庫,但是沒有真正標准化的庫。
C11添加了(合理地)完整的原子操作和原子類型的集合。 這些操作包括atomic_fetch_add
和atomic_fetch_sum
類的東西(以及*_explicit
的相同版本,可讓您指定所需的排序模型,其中默認模型始終使用memory_order_seq_cst
)。 也有fence
功能,例如atomic_thread_fence
和atomic_signal_fence
。
類型對應於每個正常整數類型-例如, atomic_int8_t
對應於int8_t
和atomic_uint_least64_t
造成相應於uint_least64_t
。 這些是在<stdatomic.h>
定義的typedef
名稱。 為了避免與任何現有名稱沖突,您可以省略標題。 編譯器本身使用實現者名稱空間中的名稱(例如_Atomic_uint_least32_t
而不是atomic_uint_least32_t
)。
“有益”是情境。 始終,性能取決於環境。 當您為這樣的互斥對象切換出互斥鎖時,您可能會期望發生一些奇妙的事情,但是您可能沒有任何好處(如果這種情況不那么流行)或使情況變得更糟(如果您不小心創建了“自旋鎖”) 。
在所有受支持的平台上,您都可以使用GLib的原子操作 。 在內置了原子操作(例如,匯編指令)的平台上,glib將使用它們。 在其他平台上,它將退回到使用互斥鎖。
我認為,即使使用互斥操作實現原子操作,也可以提高速度。 使用互斥鎖,您將至少有兩個基本操作(鎖定和解鎖)以及實際操作。 如果原子操作可用,則只需一次操作。
不確定C運行時庫的含義。 適當的語言或標准庫不為您提供執行此操作的任何方法。 您需要使用特定於操作系統的庫/ API。 另外,不要被sig_atomic_t
-乍看之下它們並不sig_atomic_t
它們那樣,僅在信號處理程序的上下文中才有用。
在Windows上,有InterlockedExchange等。 對於Linux,您可以使用glibc的原子宏 -它們是可移植的(請參閱i486 atomic.h )。 我不知道其他操作系統的解決方案。
通常,您可以在x86上使用xchg
指令進行原子操作(也可以在雙核CPU上運行)。
關於第二個問題,不,我認為使用原子操作不會比使用互斥體更快。 例如,pthreads庫已經使用原子操作實現了互斥鎖,這非常快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.