多线程编程指南

相似的同步函数:信号

信号操作在 Solaris 操作环境和 POSIX 环境中均相同。 Solaris 操作环境中的函数名 sema_ 在 pthread 中会更改为 sem_。本节讨论了以下主题:

初始化信号

使用 sema_init(3C) 可以通过 count 值来初始化 sp 所指向的信号变量。

sema_init 语法

#include <thread.h>



int sema_init(sema_t *sp, unsigned int count, int type,

    void *arg);

type 可以是以下值之一:

多个线程决不能同时初始化同一个信号。不得对其他线程正在使用的信号重新初始化。

进程内信号

#include <thread.h>



sema_t sp;

int ret;

int count;

count = 4;



/* to be used within this process only */

ret = sema_init(&sp, count, USYNC_THREAD, 0); 

进程间信号

#include <thread.h>



sema_t sp;

int ret;

int count;

count = 4;



/* to be used among all the processes */

ret = sema_init (&sp, count, USYNC_PROCESS, 0); 

sema_init 返回值

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


EINVAL

描述:

sp 引用的信号无效。


EFAULT

描述:

sparg 指向的地址非法。

增加信号

使用 sema_post(3C) 可以原子方式增加 sp 所指向的信号。如果多个线程基于该信号阻塞,则系统会解除阻塞其中一个线程。

sema_post 语法

#include <thread.h>



int sema_post(sema_t *sp);

sema_post 返回值

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


EINVAL

描述:

sp 引用的信号无效。


EFAULT

描述:

sp 指向的地址非法。


EOVERFLOW

描述:

sp 指向的信号值超过了 SEM_VALUE_MAX

基于信号计数阻塞

使用 sema_wait(3C) 可以一直阻塞调用线程,直到 sp 所指向的信号的计数变得大于零为止。计数变得大于零时,系统会以原子方式减小计数。

sema_wait 语法

#include <thread.h>



int sema_wait(sema_t *sp);

sema_wait 返回值

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


EINVAL

描述:

sp 引用的信号无效。


EINTR

描述:

等待过程已被信号或 fork() 中断。

减小信号计数

使用 sema_trywait(3C) 可以在计数大于零时,以原子方式减小 sp 所指向的信号的计数。此函数是 sema_wait() 的非阻塞版本。

sema_trywait 语法

#include <thread.h>



int sema_trywait(sema_t *sp);

sema_trywait 返回值

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


EINVAL

描述:

sp 指向的信号无效。


EBUSY

描述:

sp 所指向的信号的计数为零。

销毁信号状态

使用 sema_destroy(3C) 可以销毁与 sp 所指向的信号相关联的任何状态。不会释放用来存储该信号的空间。

sema_destroy(3C) 语法

#include <thread.h>



int sema_destroy(sema_t *sp);

sema_destroy(3C) 返回值

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


EINVAL

描述:

sp 指向的信号无效。