多线程编程指南

初始化互斥锁

使用 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

描述:

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