簡體   English   中英

執行原子操作的功能

[英]Functions for performing atomic operations

C運行時庫或任何其他實用程序庫是否支持執行原子操作(例如整數的增/減)等功能?

如果是,那么使用這些功能可以使所有操作變為原子操作?

使用此類功能是否比諸如互斥鎖等常規同步原語更有利?

操作系統:Windows,Linux,Solaris和VxWorks

C11之前

C庫沒有任何庫。

在Linux上,gcc提供了一些-查找__sync_fetch_and_add__sync_fetch_and_sub等等。

對於Windows,請查找InterlockedIncrementInterlockedDecrement``, InterlockedExchange`等。 如果您在Windows上使用gcc,我想它也具有與Linux上相同的內置功能(盡管我尚未驗證)。

在Solaris上,這取決於。 據推測,如果您使用gcc,它可能(再次)具有與Linux下相同的內置函數。 否則,到處都是庫,但是沒有真正標准化的庫。

C11

C11添加了(合理地)完整的原子操作和原子類型的集合。 這些操作包括atomic_fetch_addatomic_fetch_sum類的東西(以及*_explicit的相同版本,可讓您指定所需的排序模型,其中默認模型始終使用memory_order_seq_cst )。 也有fence功能,例如atomic_thread_fenceatomic_signal_fence

類型對應於每個正常整數類型-例如, atomic_int8_t對應於int8_tatomic_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.

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