在pthread_mutex_init之前调用pthread_mutex_lock是否安全?

Ale*_*leW 8 c mutex pthreads

我之前从未有机会使用pthreads库,但我正在审查一些涉及pthread互斥体的代码.我检查了文档pthread_mutex_lockpthread_mutex_init,和我从阅读的手册页这两种功能的理解是,我得叫pthread_mutex_init我打电话之前pthread_mutex_lock.

但是,我问了几个同事,他们认为在打电话pthread_mutex_lock之前打电话是可以的pthread_mutex_init.我正在审查的代码也pthread_mutex_lock没有打电话pthread_mutex_init.

基本上,在打电话pthread_mutex_lock之前打电话pthread_mutex_init是否安全和聪明(如果pthread_mutex_init被调用的话)?

编辑:我还看到一些示例,其中未使用pthread_mutex_lock时调用pthread_mutex_init,例如此示例

编辑#2:这是我正在审查的代码.请注意,configure函数获取并附加到某些未初始化的共享内存.稍后将使用Java代码调用lock(),而不会在其间调用其他本机函数.链接到代码

caf*_*caf 8

POSIX标准说:

如果mutex不引用初始化的互斥对象,行为pthread_mutex_lock(),pthread_mutex_trylock()pthread_mutex_unlock()是不确定的.

所以你需要初始化互斥锁.这可以通过致电来完成pthread_mutex_init() ; 或者,如果互斥锁具有静态存储持续时间,则使用静态初始化程序PTHREAD_MUTEX_INITIALIZER.例如:

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
Run Code Online (Sandbox Code Playgroud)


Pot*_*ter 8

互斥体是包含函数需要完成其工作的状态(信息)的变量.如果不需要信息,则例程不需要变量.同样,如果您向其提供随机垃圾,则例程无法正常运行.

大多数平台都接受填充零字节的互斥对象.这通常是什么 pthread_mutex_initPTHREAD_MUTEX_INITIALIZER创造.碰巧的是,C语言还保证在程序启动时将未初始化的全局变量清零.因此,您可能看起来不需要初始化pthread_mutex_t对象,但事实并非如此.特别是生活在堆栈或堆上的东西通常不会归零.

调用pthread_mutex_init pthread_lock是肯定有不良的后果.它会覆盖变量.可能的结果:

  1. 互斥锁解锁.
  2. 与另一个线程试图获得锁定的竞争条件,导致崩溃.
  3. 资源泄露在库或内核中(但在进程终止时将被释放).