4线程同步:信号量

1
信号量

信号量可以有n把锁。

依赖的头文件

#include <semaphore.h>

函数声明

sem_t
表示信号量

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


名称:


sem_init


功能:


initialize an unnamed semaphore,初始化信号量sem_t,初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享。


头文件:


#include <semaphore.h>


函数原形:


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


参数:


返回值:


sem_init() returns 0 on success; on error, -1 is returned, and errno is set to indicate the error.

int sem_wait(sem_t *sem);

int sem_trywait(sem_t *sem);


名称:


sem_wait

sem_trywait


功能:


lock a semaphore
 一直阻塞等待直到信号量 > 0.


头文件:


#include <semaphore.h>


函数原形:


int sem_wait(sem_t *sem);

int sem_trywait(sem_t *sem);


参数:


返回值:


All of these functions return 0 on success; on error, the value of 
the semaphore is left unchanged, -1 is returned, and errno is set to indicate the error.

int sem_timedwait(sem_t *sem, const structtimespec *abs_timeout);


名称:


sem_timedwait


功能:


lock a semaphore,阻塞等待若干时间直到信号量 > 0


头文件:


#include <semaphore.h>


函数原形:


int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);


参数:


返回值:


All of these functions return 0 on success; on error, the value of 
the semaphore is left unchanged, -1 is returned, and errno is set to indicate the error.

int sem_post(sem_t *sem);


名称:


sem_post


功能:


unlock a semaphore,使信号量加1。


头文件:


#include <semaphore.h>


函数原形:


int sem_post(sem_t *sem);


参数:


返回值:


sem_post() returns 0 on success; on error, the value of the semaphore is left unchanged, -1 is returned, and errno is set to indicate the error.

int sem_destroy(sem_t *sem);


名称:


sem_destroy


功能:


destroy an unnamed semaphore
释放信号量。和sem_int对应


头文件:


#include <semaphore.h>


函数原形:


int sem_destroy(sem_t *sem);


参数:


返回值:


sem_destroy() return 0 on success;on error,-1 is returned,an errno is set to indicate the error.

案例说明:


#include <stdlib.h>

#include <pthread.h>

#include <stdio.h>

#include <unistd.h>

#include <semaphore.h>

#define NUM 5

int queue[NUM];

sem_t blank_number,product_number;

void *producer(void *arg)

{

int p = 0;

while(1) {

//blank_num = 5 生产者最多生产5个

//一直阻塞等待信号量大于0

sem_wait(&blank_number);

queue[p] = rand() % 1000 + 1;

printf("Produce %d\n",queue[p]);

//product_number = 0 ->1

//使信号量加1

sem_post(&product_number);

p = (p + 1) % NUM;

sleep(rand() % 5);

}

}

void *consumer(void *arg) {

int c = 0;

while (1) {

//等待信号量大于0

sem_wait(&product_number);

printf("Consume %d\n",queue[c]);

queue[c] = 0;

//使信号量加1

sem_post(&blank_number);

c = (c + 1) % NUM;

sleep(rand() % 5);

}

}

int main(int argc ,char *argv[])

{

pthread_t pid,cid;

//将blank_num信号量初始化的值为5

sem_init(&blank_number,0,NUM);

//将product_number信号量初始化的值变为5

sem_init(&product_number,0,0);

pthread_create(&pid,NULL,producer,NULL);

pthread_create(&cid,NULL,consumer,NULL);

pthread_join(pid,NULL);

pthread_join(cid,NULL);

sem_destroy(&blank_number);

sem_destroy(&product_number);

return 0;

}

运行结果:



时间: 2025-01-07 21:40:46

4线程同步:信号量的相关文章

经典线程同步 信号量Semaphore

阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> <秒杀多线程第七篇经典线程同步互斥量Mutex> 前面介绍了关键段CS.事件Event.互斥量Mutex在经典线程同步问题中的使用.本篇介绍用信号量Semaphore来解决这个问题. 首先也来看看如何使用信号量,信号量Semaphore常用有三个函数,使用很方便.下面是这几个函数的原型和使

秒杀多线程第八篇 经典线程同步 信号量Semaphore

版权声明:本文为博主原创文章,未经博主允许不得转载. 阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> <秒杀多线程第七篇经典线程同步互斥量Mutex> 前面介绍了关键段CS.事件Event.互斥量Mutex在经典线程同步问题中的使用.本篇介绍用信号量Semaphore来解决这个问题. 首先也来看看如何使用信号量,信号量Semaphore

Linux线程同步---信号量

首先讲一下线程同步信号量的几个关键步骤! 1.定义并初始化信号量. (1) sem_t bin_sem; (2)  res = sem_init(&bin_sem,0,0); 详细步骤可以查看man帮助页面 2.使用信号量 (1) 信号量加1操作.sem_post(&bin_sem); (2) 信号量等待并减1操作.sem_wait(&bin_sem); 初始化后一般处于等待状态,执行某个操作后加1,而另个一个操作执行前进行等待操作.如果有多个线程,通常是一个线程进行加1操作,另外

线程同步——内核对象实现线程同步——信号量

1 /* 2 3 信号量内核对象 4 信号量与其它内核量相同,包含一个使用计数,除此之外还包含两个量. 5 一个最大资源计数和一个当前资源计数. 6 信号量规则如下: 7 如果当前资源计数大于0,那么信号量处于触发状态. 8 如果当前资源计数等于0,那么信号量处于未触发状态. 9 系统绝不会让当前资源计数变为负数. 10 当前资源计数绝不会大于最大资源计数. 11 12 下面我们看一下信号量的创建函数 13 HANDLE CreateSemaphore( 14 LPSECURITY_ATTRIB

linux系统编程:线程同步-信号量(semaphore)

线程同步-信号量(semaphore) 生产者与消费者问题再思考 在实际生活中,只要有商品,消费者就可以消费,这没问题.但生产者的生产并不是无限的,例如,仓库是有限的,原材料是有限的,生产指标受消费指标限制等等.为了进一步,解决好生产者与消费者问题,引入信号量进机制. 信号量 信号量(semaphore)是互斥量的升级版:互斥量的状态为0或1,而信号量可以为n.也就是说,使用互斥量时,最多允许一个线程进入关键区,而信号量允许多个,具体值是信号量当前的内部值. 相关函数 sem_t //信号量类型

转---秒杀多线程第八篇 经典线程同步 信号量Semaphore

阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> <秒杀多线程第七篇经典线程同步互斥量Mutex> 前面介绍了关键段CS.事件Event.互斥量Mutex在经典线程同步问题中的使用.本篇介绍用信号量Semaphore来解决这个问题. 首先也来看看如何使用信号量,信号量Semaphore常用有三个函数,使用很方便.下面是这几个函数的原型和使

linux网络编程-----&gt;线程同步--&gt;信号量

开发使用多线程过程中, 不可避免的会出现多个线程同时操作同一块共享资源, 当操作全部为读时, 不会出现未知结果, 一旦当某个线程操作中有写操作时, 就会出现数据不同步的事件. 而出现数据混乱的原因: 资源共享(独享资源则不会) 调试随机(对数据的访问会出现竞争) 线程间缺少必要的同步机制 以上三点, 前两点不能被改变. 欲提高效率, 传递数据, 资源必须共享. 只要资源共享, 就一定会出现线程间资源竞争, 只要存在竞争关系, 数据就会出现混乱. 所以只能从第三点着手, 使多个线程在访问共享资源的

线程同步---信号量(无名)

1. 有名信号量&无名信号量 在POSIX标准中,信号量分两种,一种是无名信号量,一种是有名信号量.无名信号量只用于线程间的同步,有名信号量只用于进程间通信.信号量是属于POSIX:SEM的,不是属于POSIX:THR的,需要的文件头是<semaphore.h>.两者的共同点都是相当于计数器,用于限制多个进程对有限共享资源的访问 2.  相关函数 1)创建信号量 int sem_init (sem_t* sem, int pshared,unsigned int value); sem

秒杀多线程第八篇 经典线程同步 信号量Semaphore (续)

java semaphore实现: Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用.Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可.比如在Windows下可以设置共享文件的最大客户端访问个数. package com.multithread.semaphore; import

秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量

版权声明:本文为博主原创文章,未经博主允许不得转载. 前面<秒杀多线程第四篇一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了四篇 <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> <秒杀多线程第七篇经典线程同步互斥量Mutex> <秒杀多线程第八篇经典线程同步信号量Semaphore> 来