簡體   English   中英

C11 stdatomic和calloc

[英]C11 stdatomic and calloc

我有一個包含原子場的結構:

#include <stdatomic.h>

struct s {
    ...
    atomic_int a;
};

這個結構分配了calloc

struct s *p = calloc(1, sizeof(struct s));

是否可以將p->a初始化為0? 代碼中有足夠的障礙,因此初始化很弱,但是初始值是否保證為0?

不,這一般不便攜。 calloc僅保證底層對象的字節0值。 對於(可能)具有狀態的類型,這不等於初始化。 您肯定必須使用atomic_init將對象置於有效狀態。

這樣做的原因是除了基礎對象之外還包含“鎖定”的平台,因為它們沒有實現相應的匯編指令。 因此,為了便於移植,您確實需要對所有非靜態分配的原子對象使用ATOMIC_VAR_INITatomic_init

也就是說,我不知道任何現有的平台需要為atomic_int這樣的atomic_int 如果您的平台將ATOMIC_INT_LOCK_FREE設置為2並且sizeof(atomic_int)==sizeof(int) ,則可以相對確定您的策略是否有效。 你可以在_Static_assert測試它。

我的猜測是這不便攜/安全。

calloc()很可能最終在內存區域做一個簡單的memset() 這個簡單的memset()不會發出所需的內存屏障,以確保讀取結構的其他線程會將p->a視為0

struct s *p = calloc(1, sizeof(struct s));
struct s *q = p;
// some other thread
foo(*q);

p或其任何組件可以訪問存儲器之前考慮初始化為零。 它是0

另請參見延遲清零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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