初始化互斥锁
销毁互斥锁
获取互斥锁
释放互斥锁
尝试获取互斥锁
使用 mutex_init(3C) 可以初始化 mp 所指向的互斥锁。对于 POSIX 线程,请参见初始化互斥锁。
#include <synch.h> #include <thread.h> int mutex_init(mutex_t *mp, int type, void *arg));
type 可以是以下值之一:
如果进程在持有 USYNC_PROCESS 锁时失败,该锁以后的请求者都将挂起。对于与客户机进程共享锁的系统,此行为会产生问题,因为客户机进程会异常中止。为了避免出现停用进程所持有的锁定挂起的问题,请使用 USYNC_PROCESS_ROBUST 来锁定互斥锁。USYNC_PROCESS_ROBUST 增加了两个功能:
如果进程停用,则系统将解除锁定该进程所持有的全部锁。
请求失败进程所拥有的任何锁的下一个请求者将获取该锁。但是,拥有该锁时会返回一个错误,指明以前的属主在拥有该锁时失败。
互斥锁还可以通过在清零的内存中进行分配来初始化,在这种情况下假定 type 为 USYNC_THREAD。
多个线程决不能同时初始化同一个互斥锁。如果其他线程正在使用互斥锁,则不得将该互斥锁重新初始化。
#include <thread.h> mutex_t mp; int ret; /* to be used within this process only */ ret = mutex_init(&mp, USYNC_THREAD, 0);
#include <thread.h> mutex_t mp; int ret; /* to be used among all processes */ ret = mutex_init(&mp, USYNC_PROCESS, 0);
#include <thread.h> mutex_t mp; int ret; /* to be used among all processes */ ret = mutex_init(&mp, USYNC_PROCESS_ROBUST, 0);
mutex_init() 在成功运行后返回 0。如果检测到以下任一情况,mutex_init() 将失败并返回对应的值。
EFAULT
描述:mp 指向的地址非法。
EINVAL
描述:mp 指定的值无效。
ENOMEM
描述:系统内存不足,无法初始化互斥锁。
EAGAIN
描述:系统资源不足,无法初始化互斥锁。
EBUSY
描述:系统检测到重新初始化活动互斥锁的尝试。
使用 mutex_destroy(3C) 可以销毁与 mp 所指向的互斥锁相关联的任何状态。用来存储该互斥锁的空间不会释放。对于 POSIX 线程,请参见pthread_mutex_destroy 语法。
#include <thread.h> int mutex_destroy (mutex_t *mp);
mutex_destroy() 在成功运行后返回 0。如果检测到以下情况,mutex_destroy() 将失败并返回对应的值。
EFAULT
描述:mp 指向的地址非法。
使用 mutex_lock(3C) 可以锁定 mp 所指向的互斥锁。如果该互斥锁已经锁定,调用线程将会阻塞,直到该互斥锁成为可用为止。调用线程会在具有优先级的队列中等待。对于 POSIX 线程,请参见pthread_mutex_lock 语法。
#include <thread.h> int mutex_lock(mutex_t *mp);
mutex_lock() 在成功运行后返回 0。如果检测到以下任一情况,mutex_lock() 将失败并返回对应的值。
EFAULT
描述:mp 指向的地址非法。
EDEADLK
描述:互斥锁已经锁定并且由调用线程拥有。
使用 mutex_unlock(3C) 可以解除锁定 mp 所指向的互斥锁。该互斥锁必须锁定。调用线程必须是最后一个锁定该互斥锁的线程,即该互斥锁的属主。对于 POSIX 线程,请参见pthread_mutex_unlock 语法。
#include <thread.h> int mutex_unlock(mutex_t *mp);
mutex_unlock() 在成功运行后返回 0。如果检测到以下任一情况,mutex_unlock() 将失败并返回对应的值。
EFAULT
描述:mp 指向的地址非法。
EPERM
描述:调用线程不拥有该互斥锁。
使用 mutex_trylock(3C) 可以尝试锁定 mp 所指向的互斥锁。此函数是 mutex_lock() 的非阻塞版本。对于 POSIX 线程,请参见pthread_mutex_trylock 语法。
#include <thread.h> int mutex_trylock(mutex_t *mp);
mutex_trylock() 在成功运行后返回 0。如果检测到以下任一情况,mutex_trylock() 将失败并返回对应的值。
EFAULT
描述:mp 指向的地址非法。
EBUSY
描述:系统检测到重新初始化活动互斥锁的尝试。