Linux系统信号量实现生产者-消费者问题

Linux系统信号量实现生产者-消费者问题

实现代码

#include<bits/stdc++.h>
#include<unistd.h>
#include<pthread.h>
#include<semaphore.h>
using namespace std;

const int BUFFER_SIZE = 1024;
const int WAIT_TIME = 10;
sem_t empty;
sem_t full;

pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;

int buffer[BUFFER_SIZE];
int front = 0, rear = 0;

void* producer(void *arg) {
	while (true) {
		sleep(random() % WAIT_TIME);
		int product = random() % 100;
		sem_wait(&empty);
		pthread_mutex_lock(&mtx);
		printf("Producer produce product %d\n", product);
		buffer[rear] = product;
		rear = (rear + 1) % BUFFER_SIZE;
		pthread_mutex_unlock(&mtx);
		sem_post(&full);
	}
	return (void*) 0;
}

void* consumer(void *arg) {
	while (true) {
		sleep(random() % WAIT_TIME);
		sem_wait(&full);
		pthread_mutex_lock(&mtx);
		printf("Consumer consume product %d\n", buffer[front]);
		front = (front + 1) % BUFFER_SIZE;
		pthread_mutex_unlock(&mtx);
		sem_post(&empty);
	}
	return (void*) 0;
}

int main(int argc, char const * argv[]) {
	pthread_t producerTID, consumerTID;
	sem_init(&empty,0, BUFFER_SIZE);
	sem_init(&full, 0, 0);
	if (pthread_create(&producerTID, NULL, producer, NULL)) {
		printf("Thread create error!\n");
		abort();
	}
	if (pthread_create(&consumerTID, NULL, consumer, NULL)) {
		printf("Thread create error\n");
		abort();
	}
	pthread_join(producerTID, NULL);
	pthread_join(consumerTID, NULL);
	sem_destroy(&full);
	sem_destroy(&empty);
	while (true);
	return 0;
}


输出结果

Producer produce product 77
Consumer consume product 77
Producer produce product 35
Consumer consume product 35
Producer produce product 49
Consumer consume product 49
Producer produce product 27
Producer produce product 59

生产者-消费者问题

设置缓冲区大小为10,生产者每隔随机时间生产1个产品放入缓冲区,消费者每隔随机时间从缓冲区取出一个产品消费,只有缓冲区不为空消费者才能消费,只有缓冲区不为满,生产者才能生产产品放入缓冲区,若缓冲区为空且消费者欲消费产品则消费者需等待,若缓冲区为满且生产者欲放入产品则生产者需等待,同时需要设置一个信号量使得生产者消费者线程能互斥访问缓冲区

信号量相关函数原型

sem_init()

  • 函数原型
    int sem_init(sem_t *sem, int pshared, unsigned int value);
  • 参数
  1. 信号量对象指针
  2. 信号量类型,0为进程内线程间共享,否则为进程间共享
  3. 信号量初始值
  • 返回值
    成功返回0,否则返回-1
  • 作用
    初始化信号量

sem_wait()

int sem_wait(sem_t * sem);

  • 参数
  1. 信号量对象指针
  • 返回值
    成功返回0,否则返回-1
  • 作用
    阻塞当前线程直到信号量的值大于0,解除阻塞后将信号量的值自减1,表明公共资源经使用后减少

sem_post()

int sem_post(sem_t *sem);

  • 参数
  1. 信号量对象指针
  • 返回值
    成功返回0,否则返回-1
  • 作用
    使信号量的值自增1,唤醒相应阻塞进程

最后

  • 上述实现可以将缓冲区改成FIFIO队列,如C++STL中的queue<int>
  • 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值