多线程编程指南

初始化信号

使用 sem_init(3RT) 可以将 sem 所指示的未命名信号变量初始化为 value

sem_init 语法

int	sem_init(sem_t *sem, int pshared, unsigned int value);
#include <semaphore.h>



sem_t sem;

int pshared;

int ret;

int value;



/* initialize a private semaphore */

pshared = 0;

value = 1;

ret = sem_init(&sem, pshared, value); 

如果 pshared 的值为零,则不能在进程之间共享信号。如果 pshared 的值不为零,则可以在进程之间共享信号。对于 Solaris 线程,请参见sema_init 语法

多个线程决不能初始化同一个信号。

不得对其他线程正在使用的信号重新初始化。

初始化进程内信号

pshared 为 0 时,信号只能由该进程内的所有线程使用。

#include <semaphore.h>



sem_t sem;

int ret;

int count = 4;



/* to be used within this process only */

ret = sem_init(&sem, 0, count); 

初始化进程间信号

pshared 不为零时,信号可以由其他进程共享。

#include <semaphore.h>



sem_t sem;

int ret;

int count = 4;



/* to be shared among processes */

ret = sem_init(&sem, 1, count);

sem_init 返回值

sem_init() 在成功完成之后会返回零。其他任何返回值都表示出现了错误。如果出现以下任一情况,该函数将失败并返回对应的值。


EINVAL

描述:

参数值超过了 SEM_VALUE_MAX


ENOSPC

描述:

初始化信号所需的资源已经用完。到达信号的 SEM_NSEMS_MAX 限制。


ENOSYS

描述:

系统不支持 sem_init() 函数。


EPERM

描述:

进程缺少初始化信号所需的适当权限。