多线程编程指南

初始化互斥锁

使用 pthread_mutex_init(3C) 可以使用缺省值初始化由 mp 所指向的互斥锁,还可以指定已经使用 pthread_mutexattr_init() 设置的互斥锁属性。mattr 的缺省值为 NULL。对于 Solaris 线程,请参见mutex_init(3C) 语法

pthread_mutex_init 语法

int	pthread_mutex_init(pthread_mutex_t *mp,

    const pthread_mutexattr_t *mattr);
#include <pthread.h>



pthread_mutex_t mp = PTHREAD_MUTEX_INITIALIZER;

pthread_mutexattr_t mattr;

int ret;



/* initialize a mutex to its default value */

ret = pthread_mutex_init(&mp, NULL);



/* initialize a mutex */

ret = pthread_mutex_init(&mp, &mattr); 

如果互斥锁已初始化,则它会处于未锁定状态。互斥锁可以位于进程之间共享的内存中或者某个进程的专用内存中。


注 –

初始化互斥锁之前,必须将其所在的内存清零。


mattr 设置为 NULL 的效果与传递缺省互斥锁属性对象的地址相同,但是没有内存开销。

使用 PTHREAD_MUTEX_INITIALIZER 宏可以将以静态方式定义的互斥锁初始化为其缺省属性。

当其他线程正在使用某个互斥锁时,请勿重新初始化或销毁该互斥锁。如果任一操作没有正确完成,将会导致程序失败。如果要重新初始化或销毁某个互斥锁,则应用程序必须确保当前未使用该互斥锁。

pthread_mutex_init 返回值

pthread_mutex_init() 在成功完成之后会返回零。其他任何返回值都表示出现了错误。如果出现以下任一情况,该函数将失败并返回对应的值。


EBUSY

描述:

该实现已检测到系统尝试重新初始化 mp 所引用的对象,即以前进行过初始化但 尚未销毁的互斥锁。


EINVAL

描述:

mattr 属性值无效。互斥锁尚未修改。


EFAULT

描述:

mp 所指向的互斥锁的地址无效。