2017-06-04 43 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