pthread_mutex_init 或 pthread_mutex_destroy 子例程

用途

初始化或破坏互斥对象。

线程库 (libpthreads.a)

语法

#include <pthread.h>

int pthread_mutex_init (mutex, attr)
pthread_mutex_t *mutex;
const pthread_mutexattr_t *attr;

int pthread_mutex_destroy (mutex)
pthread_mutex_t *mutex;

描述

pthread_mutex_init 函数使用 attr指定的属性初始化 mutex 引用的互斥对象。 如果 attr 为 NULL ,那么将使用缺省互斥属性; 效果与传递缺省互斥属性对象的地址相同。 成功初始化后,互斥对象的状态将初始化并解锁。

尝试初始化已初始化的互斥对象会导致未定义的行为。

pthread_mutex_destroy 函数破坏互斥对象引用的互斥对象; 互斥对象实际上变为未初始化。 实现可能会导致 pthread_mutex_destroymutex 引用的对象设置为无效值。 可以使用 pthread_mutex_init重新初始化已破坏的互斥对象; 未定义在对象被破坏后以其他方式引用该对象的结果。

销毁已解锁的已初始化互斥对象是安全的。 尝试销毁锁定的互斥对象会导致未定义的行为。

在缺省互斥属性适当的情况下,可以使用宏 PTHREAD_MUTEX_INITIALIZER 来初始化静态分配的互斥对象。 此效果相当于通过调用 pthread_mutex_init 并将参数 attr 指定为 NULL 进行动态初始化,但未执行任何错误检查。

参数

描述
mutex 指定要初始化或删除的互斥对象。
attr 指定互斥属性对象。

返回值

如果成功, pthread_mutex_initpthread_mutex_destroy 函数将返回零。 否则,将返回错误号以指示错误。 EBUSY 和 EINVAL 错误检查就好像它们是在函数处理开始时立即执行的一样,并在修改由 mutex指定的互斥对象的状态之前导致错误返回。

错误代码

如果发生以下情况, pthread_mutex_init 函数将失败:

描述
ENOMEM 内存不足,无法初始化互斥对象。
EINVAL attr 指定的值无效。
EPERM 调用者没有特权在严格符合环境变量 XPG_SUS_ENV=ON的标准的环境中执行操作。

在下列情况下, pthread_mutex_destroy 函数可能失败:

描述
EBUSY 该实现检测到尝试在锁定或引用 mutex 所引用的对象时 (例如,当另一个线程在 pthread_cond_waitpthread_cond_timedwait 中使用时) 破坏该对象。
EINVAL mutex 指定的值无效。

这些函数不会返回错误代码 EINTR。