2015-07-20 55 views
4

我想在FreeBSD 10.1版本使用原子能的C鏗鏘3.6.1,但是當我嘗試編譯在atomic_flag變量使用ATOMIC_FLAG_INIT程序在struct我初始化一個原子標誌獲得error: expected expression在malloc分配結構

這是我正在編譯的程序。

#include <stdio.h> 
#include <stdatomic.h> 

struct map 
{ 

    atomic_flag flag; 

}; 

int main(void) 
{ 
    struct map *m = malloc(sizeof(struct map)); 

    m->flag = ATOMIC_FLAG_INIT; 

    free(m); 

    return 0; 
} 

我可以使用atomic_flagstructs像下面而不是在structs的例子,所以你怎麼Cstructs使用原子變量?

#include <stdio.h> 
#include <stdatomic.h> 

int main(void) 
{ 
    atomic_flag flag = ATOMIC_FLAG_INIT; 

    return 0; 
} 
+0

你是否知道'm'是未初始化的? – Olaf

+0

是的,但即使初始化結構,你也會得到相同的編譯器錯誤。 – 2trill2spill

+0

我應該把它標記爲「note」。當然,這並不能解決錯誤。但是,如果你創建一個自動變量呢? – Olaf

回答

5

atomic_flag沒有值,您可以分配或讀取,但只有一個內部狀態。

atomic_flag互動的唯一方法是定義它的兩個功能(或四個,如果您計算_explicit版本)。對於你的情況,當你通過malloc得到你的對象時,該標誌處於「不確定狀態」(C11的7.17.8 p4)。您可以通過應用以下兩個函數之一來簡單地將其置於已知狀態,即使用atomic_flag_clear將其設置爲「清除」狀態,或使用atomic_flag_test_and_set將其設置爲「設置」狀態。

在分配malloc之後使用atomic_flag_clear是 相當於初始化變量ATOMIC_FLAG_INIT

+0

downvoter,介意解釋一下? –

+0

你能更徹底嗎? – 2trill2spill

+0

感謝您更新您的答案,當我嘗試'malloc'後的'atomic_flag_clear'工作,但不是如果我將結構映射爲共享內存,它會在'atomic_flag_clear'上分段錯誤。我使用'struct map * m = mmap(NULL,sizeof(struct map),PROT_READ | PROT_WRITE,MAP_ANON | MAP_SHARED,-1,0);' – 2trill2spill

-1

atomic_flag不用初始化(由ATOMIC_FLAG_INIT)是不確定的,這原子數據類型沒有商店&負載功能,所以編譯器做得很好呻吟。此外,你甚至沒有爲結構分配內存,只是在棧上創建了一個指針。

+0

好的,是的,我應該分配結構,但我怎麼在結構中使用'atomic_flag'或者是不可能的? – 2trill2spill

+0

你可以在堆棧上創建你的結構,包括'atomic_flag'的即時初始化,並且複製到共享內存或進一步傳遞結構地址(當不是返回值時,原點保持在作用域中)。 – Youka

+0

'atomic_flag'沒有初始化就處於未確定狀態。您可以使用兩種功能之一將其置於確定的狀態。 –