linux生产者消费者(使用信号量)

本文探讨了如何在Linux环境中利用信号量解决生产者消费者问题。重点介绍了使用互斥量(mutex)的步骤,并强调了在实现线程同步时必须使用全局变量以确保多个线程共享相同的状态。
摘要由CSDN通过智能技术生成

信号量:

应用于线程、进程间同步。
相当于 初始化值为 N 的互斥量。  N值,表示可用资源数, 可以同时访问共享数据区的线程数。
函数:
	sem_t sem;	定义类型。
	int sem_init(sem_t *sem, int pshared, unsigned int value);

	参数:
		sem: 信号量 
		pshared:	0: 用于线程间同步
			1: 用于进程间同步
		value:N值。(表示可用资源数)

	sem_destroy();
	sem_wait();		一次调用,做一次-- 操作, 当信号量的值为 0 时,再次 -- 就会阻塞。 (对比 pthread_mutex_lock)
	sem_post();		一次调用,做一次++ 操作. 当信号量的值为 N 时, 再次 ++ 就会阻塞。(对比 pthread_mutex_unlock)

使用mutex(互斥量、互斥锁)一般步骤:
pthread_mutex_t 类型。

1. pthread_mutex_t lock;  创建锁
2  pthread_mutex_init; 初始化		1
3. pthread_mutex_lock;加锁		1--	--> 0
4. 访问共享数据(stdout)		
5. pthrad_mutext_unlock();解锁		0++	--> 1
6. pthead_mutex_destroy;销毁锁

初始化互斥量:
	pthread_mutex_t mutex;
	1. pthread_mutex_init(&mutex, NULL);   			动态初始化。
	2. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;	静态初始化。
注意事项:
	尽量保证锁的粒度, 越小越好。(访问共享数据前,加锁。访问结束【立即】解锁。)
	互斥锁,本质是结构体。 我们可以看成整数。 初值为 1。(pthread_mutex_init() 函数调用成功。)
	加锁: --操作, 阻塞线程。
	解锁: ++操作, 换醒阻塞在锁上的线程。
	try锁:尝试加锁,成功--。失败,返回。同时设置错误号 EBUSY
/*信号量实现 生产者 消费者问题*/

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

#define NUM 5               

int queue[NUM];                                     //全局数组实现环形队列
sem_t blank_number, product_number;                 //空格子信号量, 产品信号量

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;


void *producer(void *arg)
{
   
    int i = 0;

    while (1) {
   
        sem_wait(&blank_number);                    //生产者将空格子数--,为0则阻塞等待
        queue[i] = rand() % 1000 + 1;               //生产一个产品
        printf("----Produce---%d\n", queue[i]);        
        
	sem_post(&product_number);                  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值