首页 > 系统相关 >Linux 通过信号量semaphore实现生产者消费者模型

Linux 通过信号量semaphore实现生产者消费者模型

时间:2023-01-24 10:22:22浏览次数:40  
标签:product include Linux blank 信号量 semaphore sem NULL

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>


#define N 5

void sys_err(const char *msg) {
}


// 定义一个队列, 全局数组实现环形队列
int queue[N];

// 定义产品信号量 和 空格子信号量
sem_t sem_product, sem_blank;


// 生产者
void * producer(void *arg) {
	int i = 0;
	while(1) {
		// 阻塞等待有可用的 blank
		sem_wait(&sem_blank);
		// 随机产生一个产品
		queue[i] = rand() % 1000 + 1;
		// 打印输出产生的产品
		printf("-----produce: %d \n", queue[i]);
		// 产品已产生, 可以释放一个 product. 可以理解为sem_product++
		sem_post(&sem_product);
		// 设置 i 循环
		i = (i + 1) % N;
		sleep(rand() % 1);

	}
	// return NULL;
}

// 消费者
void * consumer(void *arg) {
	int i = 0;
	while(1) {
		// 消费者调用 sem_wait() 对产品阻塞
		sem_wait(&sem_product);
		// 打印获取到的产品
		printf("----------------------consumer: %d \n", queue[i]);
		// 将该位置的产品设置为 0, 表示该位置已经空出来了
		queue[i] = 0;
		// 成功拿走一个 product, 则释放出了一个 blank
		sem_post(&sem_blank);

		// 让 i 从 0 到 4 循环往复
		i = (i + 1) % N;

		sleep(rand() % 3);
	}
	// return NULL;
}

/* 生产者需要的是 blank, 当blank 都被填满的时候就阻塞了 */
/* 消费者需要的是 product, 当没有 product 的时候(即5个都是 blank)时,就阻塞了 */

/* 当消费者拿走一个 product 后,就空出了一个 blank, 所以可以释放一个 blank
   同理,当生产者产生一个 product 后,就多个一个产品, 所以可以释放一个 product
 */



int main(int argc, const char * argv[]) {
	pthread_t pid, cid;

	// 初始化 sem_blank 信号量为 5, 且为线程间共享
	sem_init(&sem_blank, 0, N);
	// 初始化 sem_product 信号量为0 , 且为线程间共享
	sem_init(&sem_product, 0, 0);

	// 创建生产者和消费者两个子线程
	pthread_create(&pid, NULL, producer, NULL);
	pthread_create(&cid, NULL, consumer, NULL);

	// 回收两个子线程
	pthread_join(pid, NULL);
	pthread_join(cid, NULL);

	// 回收两个信号量
	sem_destroy(&sem_blank);
	sem_destroy(&sem_product);

	return 0;
}

标签:product,include,Linux,blank,信号量,semaphore,sem,NULL
From: https://www.cnblogs.com/zxhoo/p/17065895.html

相关文章

  • Programming Linux User Guide
    ProgrammingLinuxUserGuidemanagesoftware/optvs/usr/local/optisreservedfortheinstallationofadd-onapplicationsoftwarepackages.The/usr/local......
  • archlinux将python更换到3.11
    python更换到3.11版本安装python3.11首先利用yay-Spython311生成缓存文件,在~/.cache/yay/python311接着去官网下载一个python3.11的包,https://aur.archlinux.org/pack......
  • Basic Linux User Guide
    NormalUbuntuUserGuide!ConceptsEverythingisfile.Opensource.Usefulknowledge.desktopfile-shorticonA.desktopfileissimplyashortcutthat......
  • archlinux连接Github与本地
    连接Github与本地首先右键打开gitbash,然后输入下面命令:gitconfig--globaluser.name"vconlln"gitconfig--globaluser.email"[email protected]"用户名和......
  • Linux Debian11安装QT6开发环境
    从Qt5.14开始,官方不提供离线安装包,只提供源码包和在线安装器。但是清华为我们提供了快速的在线安装方式。一.下载清华提供的在线安装器在线安装器下载链接二、给在线安装......
  • archlinux手机投屏
    多屏协同......
  • Linux下手工编译libiconv库的小问题
    我的电脑是Ubuntu14.04LTS,自己手工编译php5.6,打开ZEND_EXTRA_LIBS='-liconv'时,发现没有安装libiconv,也就是编码转换的库,所以百度该库的安装方法,如下:......
  • 【ubuntu基础】linux常用命令总结
    前言 常用命令查看cpu内存使用情况tophtop 解压文件至某个目录tar-zxvfaaa.tar.gz-C/path/to/untar/​​ 删除size为0的文件​​find.-name"*"-typef-size0c......
  • Linux系统编程—进程(作业+答案)
    文章目录​​程序和进程​​​​并发​​​​单道程序设计​​​​多道程序设计​​​​CPU和MMU​​​​进程控制块PCB​​​​环境变量:​​​​常见环境变量​​​​PATH......
  • 面试常问的21条Linux命令
    本文章总结了21条最频繁使用的Linux命令,也是面试官考察你对Linux系统熟不熟常问的面试题,可以收藏本文章,作为一个Linux命令速查手册。文章目录​​一、文件和目录​​​​二......