【C/C++多线程编程之七】pthread信号量

多线程编程之信号量

Pthread是 POSIX threads 的简称,是POSIX的线程标准

互斥量用来处理一个共享资源的同步访问问题,当有多个共享资源时,就需要用到信号量机制。

         信号量机制用于保证两个或多个共享资源被线程协调地同步使用,信号量的值对应当前可用资源的数量。

         1.信号量samaphore):

        信号量机制通过信号量的值控制可用资源的数量。线程访问共享资源前,需要申请获取一个信号量,如果信号量为0,说明当前无可用的资源,线程无法获取信号量,则该线程会等待其他资源释放信号量(信号量加1)。如果信号量不为0,说明当前有可用的资源,此时线程占用一个资源,对应信号量减1。

        举例:

        停车场有5个停车位,汽车可使用停车位。在这里5个停车位是共享的资源,汽车是线程。开始信号量为5,表明此时有5个停车位可用。一辆汽车进入停车场前,先查询信号量的值,不为0表明有可用停车位,汽车进入停车场并使用一个停车位,信号量减1,表明占用一个停车位,可用数减少。

       

2.信号量基本函数

          #include <semaphore.h>

初始化信号量:

int sem_init(sem_t *sem, int pshared, unsigned int val);

        该函数第一个参数为信号量指针,第二个参数为信号量类型(一般设置为0),第三个为信号量初始值。第二个参数pshared为0时,该进程内所有线程可用,不为0时不同进程间可用。

信号量减1:

int sem_wait(sem_t *sem);

        该函数申请一个信号量,当前无可用信号量则等待,有可用信号量时占用一个信号量,对信号量的值减1。

信号量加1:

int sem_post(sem_t *sem);

销毁信号量:

int sem_destory(sem_t *sem);

        该函数释放一个信号量,信号量的值加1。

        3.牛刀小试

        采用信号量机制,解决苹果橙子问题:一个能放N(这里N设为3)个水果的盘子,爸爸只往盘子里放苹果,妈妈只放橙子,女儿只吃盘子里的橙子,儿子只吃苹果。

        采用三个信号量:

        1.sem_t empty:信号量empty控制盘子可放水果数,初始为3,因为开始盘子为空可放水果数为3。

        2.sem_t  apple ;信号量apple控制儿子可吃的苹果数,初始为0,因为开始盘子里没苹果。

        3.sem_t orange;信号量orange控制女儿可吃的橙子是,初始为0,因为开始盘子里没橙子。

注:互斥量work_mutex只为printf输出时能够保持一致,可忽略。

 

【C/C++多线程编程之七】pthread信号量,布布扣,bubuko.com

时间: 2024-12-17 22:25:47

【C/C++多线程编程之七】pthread信号量的相关文章

多线程编程:同时使用信号量与互斥锁

#include <pthread.h> #include <semaphore.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <cerrno> #define CUSTOMER_NUM 10 pthread_mutex_t mutex_x= PTHREAD_MUTEX_INITIALIZER; sem_t sem; int sem_val

【C/C++多线程编程之十】pthread线程私有数据

多线程编程之线程私有数据 Pthread是 POSIX threads 的简称,是POSIX的线程标准.  线程同步从互斥量[C/C++多线程编程之六]pthread互斥量,信号量[C/C++多线程编程之七]pthread信号量,条件变量[C/C++多线程编程之八]pthread条件变量,读写锁[C/C++多线程编程之九]pthread读写锁,多线程的同步机制已经有了清晰深入的探究,多线程编程的精髓所在,需要深入理解.        线程私有数据TSD(Thread-specific Data)

【C/C++多线程编程之八】pthread条件变量

多线程编程之条件变量 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 互斥机制,包括互斥量[C/C++多线程编程之六]pthread互斥量,信号量[C/C++多线程编程之七]pthread信号量,互斥能很好的处理共享资源访问的协调问题,是多线程同步必不可少的机制.互斥机制也有其缺陷,当线程在等待共享资源满足某个条件,互斥机制下,必须不断地加锁和解锁,其间查询共享资源是否满足条件,这将带来巨大的消耗.         此时,需要新的机制来解决这个问题.      

Linux多线程编程-信号量

在Linux中,信号量API有两组,一组是多进程编程中的System V IPC信号量:另外一组是我们要讨论的POSIX信号量.这两组接口类似,但不保证互换.POSIX信号量函数都已sem_开头,并不像大多数线程函数那样以pthread_开头,常用的有以下5个: #include <semaphore.h> int sem_init(sem_t* sem, int pshared, unsigned int value); int sem_destroy(sem_t *sem); int se

pthread多线程编程的学习小结

pthread多线程编程的学习小结 程序员必上的开发者服务平台 —— DevStore pthread多线程编程整理 1 Introduction 不用介绍了吧… 2 Thread Concepts 1.     Thread由下面部分组成: a.     Thread ID b.     Stack c.     Policy d.     Signal mask e.     Errno f.      Thread-Specific Data 3 Thread Identification

为什么对多线程编程这么怕?pthread,sem,mutex,process

转自http://blog.chinaunix.net/uid-20788636-id-1841334.html 1.线程创建和退出创建线程实际上就是确定调用该线程函数的入口点,这里通常使用的函数是pthread_create.在线程创建以后,就开始运行相关的线程函数,在该函数运行完之后,该线程也就退出了,这也是线程退出一种方法.另一种退出线程的方法是使用函数pthread_exit,这是线程的主动行为.在线程中使用pthread_exit来代替进程中的exit.由于一个进程中的多个线程是共享数

【C/C++多线程编程之四】终止pthread线程

多线程编程之终止pthread线程  Pthread是 POSIX threads 的简称,是POSIX的线程标准.           终止线程似乎是多线程编程的最后一步,但绝不是本系列教材的结束.线程创建到线程终止,希望先给读者一个关于多线程编程的总体认识.           1.终止Pthread线程:pthread_exit()           參数:           ret:地址指针,本质上是返回值写入的地址.           终止线程是线程的主动行为,一个线程调用pth

linux pthread多线程编程模板

pthread_create() 创建线程,pthread_join()让线程一直运行下去. 链接时要加上-lpthread选项. pthread_create中, 第三个参数为线程函数,定义如下: void * heartbeat_thread() { ... } 下面是main.c : #include <pthread.h> pthread_t thread[MAX_THREAD_NUM]; pthread_mutex_t cache_mutex; pthread_mutex_t var

【C/C++多线程编程之九】pthread读写锁

多线程编程之读写锁 Pthread是 POSIX threads 的简称,是POSIX的线程标准.  pthread读写锁把对共享资源的访问者分为读者和写者,读者只对共享资源进行读访问,写者只对共享资源进行写操作.在互斥机制,读者和写者都需要独立独占互斥量以独占共享资源,在读写锁机制下,允许同时有多个读者读访问共享资源,只有写者才需要独占资源.相比互斥机制,读写机制由于允许多个读者同时读访问共享资源,进一步提高了多线程的并发度.                   1.读写锁机制: