2017-06-04 40 views
1
#include <pthread.h> 

pthread_mutex_t* mut; 

int main() 
{ 
     mut = PTHREAD_MUTEX_INITIALIZER; 
} 

上面的代碼吐出了error: expected expression before ‘{’ token我應該如何初始化pthread互斥體?

#include <pthread.h> 

pthread_mutex_t* mut = PTHREAD_MUTEX_INITIALIZER; 

int main() 
{ 

} 

上面的代碼吐出警告:周圍標量初始化

所以括號我怎麼初始化一個互斥?

回答

7

它是一種錯誤,你應該使用:的pthread_mutex_t代替pthread_mutex_t*

pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; 

爲什麼編譯器抱怨是嘗試的PTHREAD_MUTEX_INITIALIZER這個宏擴展分配給指針原因:

{ { 0, 0, 0, 0, 0, __PTHREAD_SPINS, { 0, 0 } } } 

使用更正的方法,您可以在需要的地方通過&mutpthread_mutex_t*

2

首先你應該聲明它爲pthread_mutex_t而不是指針pthread_mutex_t *。您還應該決定互斥鎖是全局函數還是本地函數。

如果它的全球可以使用初始化:如果是本地pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;

你必須調用:pthread_mutex_init(&mut,NULL);(你必須檢查返回值)

注意PTHREAD_MUTEX_INITIALIZER是一個宏,你不能將其分配給一個指針。

pthread_mutex_init()手冊頁:

只有互斥體本身可用於執行同步。在調用 pthread_mutex_lock(),pthread_mutex_trylock(),pthread_mutex_unlock(), 和pthread_mutex_destroy()的調用中引用互斥體的副本的 未定義。 試圖初始化一個已經初始化的互斥體導致 未定義的行爲。

通常,如果要爲屬性設置鎖定(函數的第二個參數),如進程之間可共享或遞歸,則使用帶函數調用的方法。

+0

爲什麼沒有'='登錄'pthread_mutex_t mut PTHREAD_MUTEX_INITIALIZER'? – gaazkam

+0

因爲我只是忘了它。 – BetaRunner