我该如何初始化pthread互斥锁?

时间:2017-06-04 06:20:58

标签: c initialization pthreads mutex

#include <pthread.h>

pthread_mutex_t* mut;

int main()
{
        mut = PTHREAD_MUTEX_INITIALIZER;
}

以上代码吐出error: expected expression before ‘{’ token

#include <pthread.h>

pthread_mutex_t* mut = PTHREAD_MUTEX_INITIALIZER;

int main()
{

}

上面的代码吐出警告:标量初始化器周围的大括号

那么我应该如何初始化互斥锁呢?

2 个答案:

答案 0 :(得分:7)

这是类型错误,您应该使用:npm WARN retry will retry, error on last attempt: Error: EBUSY: resource busy or locked, rename 'D:\Users\Subho\AppD ata\Local\Temp\npm-9484-8858437e\registry.npmjs.org\electron-to-chromium\-\electron-to-chromium-1.3.13.tgz.111430805 1' -> 'D:\Users\Subho\AppData\Local\Temp\npm-9484-8858437e\registry.npmjs.org\electron-to-chromium\-\electron-to-chr omium-1.3.13.tgz' npm ERR! Windows_NT 10.0.14393 npm ERR! argv "D:\\Program Files\\nodejs\\node.exe" "D:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "install" "--global" "vue-cli" npm ERR! node v6.10.3 npm ERR! npm v3.10.10 npm ERR! tarball.destroy is not a function npm ERR! npm ERR! If you need help, you may report this error at: npm ERR! <https://github.com/npm/npm/issues> npm WARN retry will retry, error on last attempt: Error: EBUSY: resource busy or locked, rename 'D:\Users\Subho\AppD ata\Local\Temp\npm-9484-8858437e\registry.npmjs.org\electron-to-chromium\-\electron-to-chromium-1.3.13.tgz.311380074 4' -> 'D:\Users\Subho\AppData\Local\Temp\npm-9484-8858437e\registry.npmjs.org\electron-to-chromium\-\electron-to-chr omium-1.3.13.tgz' npm ERR! Windows_NT 10.0.14393 npm ERR! argv "D:\\Program Files\\nodejs\\node.exe" "D:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "install" "--global" "vue-cli" npm ERR! node v6.10.3 npm ERR! npm v3.10.10 npm ERR! tarball.destroy is not a function npm ERR! npm ERR! If you need help, you may report this error at: npm ERR! <https://github.com/npm/npm/issues> 而不是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 } } } 所需的任何地方传递&mut

答案 1 :(得分: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()未定义。   尝试初始化已初始化的互斥锁导致   未定义的行为。

通常,如果要将属性设置为锁(函数的第二个参数),例如进程之间的可共享或递归,则使用带有函数调用的方法。