多线程编程指南

相似的同步函数-互斥锁

初始化互斥锁

使用 mutex_init(3C) 可以初始化 mp 所指向的互斥锁。对于 POSIX 线程,请参见初始化互斥锁

mutex_init(3C) 语法

#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 增加了两个功能:

互斥锁还可以通过在清零的内存中进行分配来初始化,在这种情况下假定 typeUSYNC_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 返回值

mutex_init() 在成功运行后返回 0。如果检测到以下任一情况,mutex_init() 将失败并返回对应的值。


EFAULT

描述:

mp 指向的地址非法。


EINVAL

描述:

mp 指定的值无效。


ENOMEM

描述:

系统内存不足,无法初始化互斥锁。


EAGAIN

描述:

系统资源不足,无法初始化互斥锁。


EBUSY

描述:

系统检测到重新初始化活动互斥锁的尝试。

销毁互斥锁

使用 mutex_destroy(3C) 可以销毁与 mp 所指向的互斥锁相关联的任何状态。用来存储该互斥锁的空间不会释放。对于 POSIX 线程,请参见pthread_mutex_destroy 语法

mutex_destroy 语法

#include <thread.h>



int mutex_destroy (mutex_t *mp);

mutex_destroy 返回值

mutex_destroy() 在成功运行后返回 0。如果检测到以下情况,mutex_destroy() 将失败并返回对应的值。


EFAULT

描述:

mp 指向的地址非法。

获取互斥锁

使用 mutex_lock(3C) 可以锁定 mp 所指向的互斥锁。如果该互斥锁已经锁定,调用线程将会阻塞,直到该互斥锁成为可用为止。调用线程会在具有优先级的队列中等待。对于 POSIX 线程,请参见pthread_mutex_lock 语法

mutex_lock 语法

#include <thread.h>



int mutex_lock(mutex_t *mp);

mutex_lock 返回值

mutex_lock() 在成功运行后返回 0。如果检测到以下任一情况,mutex_lock() 将失败并返回对应的值。


EFAULT

描述:

mp 指向的地址非法。


EDEADLK

描述:

互斥锁已经锁定并且由调用线程拥有。

释放互斥锁

使用 mutex_unlock(3C) 可以解除锁定 mp 所指向的互斥锁。该互斥锁必须锁定。调用线程必须是最后一个锁定该互斥锁的线程,即该互斥锁的属主。对于 POSIX 线程,请参见pthread_mutex_unlock 语法

mutex_unlock 语法

#include <thread.h>



int mutex_unlock(mutex_t *mp);

mutex_unlock 返回值

mutex_unlock() 在成功运行后返回 0。如果检测到以下任一情况,mutex_unlock() 将失败并返回对应的值。


EFAULT

描述:

mp 指向的地址非法。


EPERM

描述:

调用线程不拥有该互斥锁。

尝试获取互斥锁

使用 mutex_trylock(3C) 可以尝试锁定 mp 所指向的互斥锁。此函数是 mutex_lock() 的非阻塞版本。对于 POSIX 线程,请参见pthread_mutex_trylock 语法

mutex_trylock 语法

#include <thread.h>



int mutex_trylock(mutex_t *mp);

mutex_trylock 返回值

mutex_trylock() 在成功运行后返回 0。如果检测到以下任一情况,mutex_trylock() 将失败并返回对应的值。


EFAULT

描述:

mp 指向的地址非法。


EBUSY

描述:

系统检测到重新初始化活动互斥锁的尝试。