新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 多线程编程之:Linux线程编程

多线程编程之:Linux线程编程

作者:时间:2013-09-13来源:网络收藏


本文引用地址:http://www.amcfsurvey.com/article/257101.htm

2.信号量线程控制

(1)信号量说明。

在第8章中已经讲到,信号量也就是中所用到的PV原子操作,它广泛用于进程或线程间的同步与互斥。信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。这里先来简单复习一下PV原子操作的工作原理。


PV原子操作是对整数计数器信号量sem的操作。一次P操作使sem减一,而一次V操作使sem加一。进程(或线程)根据信号量的值来判断是否对公共资源具有访问权限。当信号量sem的值大于等于零时,该进程(或线程)具有公共资源的访问权限;相反,当信号量sem的值小于零时,该进程(或线程)就将阻塞直到信号量sem的值大于等于0为止。


PV原子操作主要用于进程或线程间的同步和互斥这两种典型情况。若用于互斥,几个进程(或线程)往往只设置一个信号量sem,它们的操作流程如图9.2所示。


当信号量用于同步操作时,往往会设置多个信号量,并安排不同的初始值来实现它们之间的顺序执行,它们的操作流程如图9.3所示。


图9.2 信号量互斥操作 图9.3 信号量同步操作


(2)函数说明。

实现了POSIX的无名信号量,主要用于线程间的互斥与同步。这里主要介绍几个常见函数。


n sem_init()用于创建一个信号量,并初始化它的值。

n sem_wait()和sem_trywait()都相当于P操作,在信号量大于零时它们都能将信号量的值减一,两者的区别在于若信号量小于零时,sem_wait()将会阻塞进程,而sem_trywait()则会立即返回。

n sem_post()相当于V操作,它将信号量的值加一同时发出信号来唤醒等待的进程。

n sem_getvalue()用于得到信号量的值。

n sem_destroy()用于删除信号量。


(3)函数格式。

表9.7列出了sem_init()函数的语法要点。

表9.7 sem_init()函数语法要点

所需头文件

#include semaphore.h>

函数原型

int sem_init(sem_t *sem,int pshared,unsigned int value)

函数传入值

sem:信号量指针

pshared:决定信号量能否在几个进程间共享。由于目前还没有实现进程间共享信号量,所以这个值只能够取0,就表示这个信号量是当前进程的局部信号量

value:信号量初始化值

函数返回值

成功:0

出错:-1


表9.8列出了sem_wait()等函数的语法要点。

表9.8 sem_wait()等函数语法要点

所需头文件

#include pthread.h>

函数原型

int sem_wait(sem_t *sem)
int sem_trywait(sem_t *sem)
int sem_post(sem_t *sem)
int sem_getvalue(sem_t *sem)
int sem_destroy(sem_t *sem)

函数传入值

sem:信号量指针

函数返回值

成功:0

出错:-1

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

linux相关文章:linux教程




评论


相关推荐

技术专区

关闭