[英]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_INIT
或atomic_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.