多线程的生产者以及消费者程序。

首先说一下信号量的PV操作:

1.PV操作:P操作使sem减一,V操作使sem加一。根据信号量的值来判断是否对公共资源的访问与操作权限。 当sem大于等于0时候,才有访问权限。当sem1小于等于0则被堵塞,直到大于为止。

2.相关函数说明

sem_ini: 创建一个信号量以及初始化值。

sem_wait与sem_trywait :P操作,sem_wait当信号量小于零时维度赛,sem_trywait则会立即返回。

sem_post:V操作,他将信号量加一,并唤醒P操作的等待线程。

sem_getvalue:用于获取信号量的值

sem_destory:用于删除信号量

Demo例子:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<errno.h>
#include<sys/ipc.h>
#include<semaphore.h>
#include<fcntl.h>

#define FIFO "myfifo"
#define N 5
int lock_var;
time_t end_time;
char buf_r[100];
sem_t mutex,full,avail;
int fd;
void productor(void *arg);
void consumer(void *arg);

int main(int argc ,char *arhv[])
{
    pthread_t id1,id2;
    pthread_t mon_th_id;
    int ret;
    end_time=time(NULL)+30;
    if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
        printf("cannot create fifoserver\n");
    printf("preparing for reading bytes...\n");
    memset(buf_r,0,sizeof(buf_r));
    fd=open(FIFO,O_RDWR|O_NONBLOCK,0);
    if(fd==-1)
    {
        perror("open");
        exit(1);
    }
    ret=sem_init(&mutex,0,1);
    ret=sem_init(&avail,0,N);
    ret=sem_init(&full,0,0);
    if(ret!=0)
    {
        perror("sem_init");
    }
    ret=pthread_create(&id1,NULL,(void *)productor,NULL);
    ret=pthread_create(&id2,NULL,(void *)consumer,NULL);
    pthread_join(id1,NULL);
    pthread_join(id2,NULL);
    exit(0);
}

void productor(void *arg)
{
    int i,nwrite;
    while(time(NULL)<end_time)
    {
        sem_wait(&avail);
        sem_wait(&mutex);
    
        if((nwrite=write(fd,"hello",5))==-1)
        {
            if(errno==EAGAIN)
                printf("the fifo has not been read yet\n");

        }
        else
            printf("write hello to the fifo\n");

        sem_post(&full);
        sem_post(&mutex);
        sleep(1);
    }
}

void consumer(void *arg)
{
    int nolock=0;
    int ret,nread;
    while(time (NULL)<end_time)
    {
        sem_wait(&full);
        sem_wait(&mutex);
        memset(buf_r,0,sizeof(buf_r));
        if((nread=read(fd,buf_r,100))==-1)
        {
            if(errno==EAGAIN)
                 printf("no data\n");
        }
        printf("read %s from FIFO\n",buf_r);
        sem_post(&avail);
        sem_post(&mutex);
        sleep(1);

    }


}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值