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_destroy 将 mutex 引用的对象设置为无效值。 可以使用 pthread_mutex_init重新初始化已破坏的互斥对象; 未定义在对象被破坏后以其他方式引用该对象的结果。
销毁已解锁的已初始化互斥对象是安全的。 尝试销毁锁定的互斥对象会导致未定义的行为。
在缺省互斥属性适当的情况下,可以使用宏 PTHREAD_MUTEX_INITIALIZER 来初始化静态分配的互斥对象。 此效果相当于通过调用 pthread_mutex_init 并将参数 attr 指定为 NULL 进行动态初始化,但未执行任何错误检查。
参数
| 项 | 描述 |
|---|---|
| mutex | 指定要初始化或删除的互斥对象。 |
| attr | 指定互斥属性对象。 |
返回值
如果成功, pthread_mutex_init 和 pthread_mutex_destroy 函数将返回零。 否则,将返回错误号以指示错误。 EBUSY 和 EINVAL 错误检查就好像它们是在函数处理开始时立即执行的一样,并在修改由 mutex指定的互斥对象的状态之前导致错误返回。
错误代码
如果发生以下情况, pthread_mutex_init 函数将失败:
| 项 | 描述 |
|---|---|
| ENOMEM | 内存不足,无法初始化互斥对象。 |
| EINVAL | attr 指定的值无效。 |
| EPERM | 调用者没有特权在严格符合环境变量 XPG_SUS_ENV=ON的标准的环境中执行操作。 |
在下列情况下, pthread_mutex_destroy 函数可能失败:
| 项 | 描述 |
|---|---|
| EBUSY | 该实现检测到尝试在锁定或引用 mutex 所引用的对象时 (例如,当另一个线程在 pthread_cond_wait或 pthread_cond_timedwait 中使用时) 破坏该对象。 |
| EINVAL | mutex 指定的值无效。 |
这些函数不会返回错误代码 EINTR。