线程&PV操作以及实现生产消费者问题

本文详细介绍了Linux环境下使用线程及PV操作实现生产者消费者问题。内容涵盖线程创建、线程挂起(pthread_join)、线程退出、获取线程ID,以及信号量的创建(sem_init)、等待(sem_wait)、释放(sem_post)和删除(sem_destroy)。通过这些基础操作,可以构建多线程同步的解决方案。
摘要由CSDN通过智能技术生成

·1.线程创建
  函数原型:int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void),void *restrict arg);
  返回值:若是成功建立线程返回0,否则返回错误的编号。
  形式参数:pthread_t *restrict tidp要创建的线程的线程id指针;const pthread_attr_t *restrict attr创建线程时的线程属性;void* (start_rtn)(void)返回值是void类型的指针函数;void *restrict arg start_rtn的形参。

·线程挂起:该函数的作用使得当前线程挂起,等待另一个线程返回才继续执行。也就是说当程序运行到这个地方时,程序会先停止,然后等线程id为thread的这个线程返回,然 后程序才会断续执行。
函数原型:int pthread_join( pthread_t thread, void **value_ptr);
  参数说明如下:thread等待退出线程的线程号;value_ptr退出线程的返回值。
·线程退出
  函数原型:void pthread_exit(void *rval_ptr);
  ·获取当前线程id
  函数原型:pthread_t pthread_self(void);

2.  a)创建信号量  sem_init
    b)等待信号量 sem_wait
    c)释放信号量 sem_pos
    d)删除信号量 sem_destro

<span style="font-size:18px;">#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <pthread.h>  
#include <semaphore.h>  
  
#define BUF_SZ 1024  
  
sem_t sem1,sem2;  
  
  
char buf[BUF_SZ];  
  
void *write(void *buf)                  //生产者写入  
{  
  
    while(1)  
    {  
        sem_wait(&sem1);               //信号量sem1 p操作  
        printf("writing...\n");  
        if(fgets(buf, BUF_SZ, stdin) == NULL)      //从键盘获取字符写到数组buf  
        {  
            printf("write error!\n");  
            exit(1);  
        }  
        
        if(strncmp(buf,"end",3) == 0) //输入end退出线程1  
        {  
            sem_post(&sem2); //信号量sem2 v操作  
            break;  
        }  
  
        sem_post(&sem2); //信号量sem2 v操作  
    }  
}  
  
void *read(void *buf)           //消费者读取  
{  
    while(1)  
    {  
        sem_wait(&sem2);           //信号量sem2 p操作  
        printf("read %s",buf);             
          
        if(strncmp((buf,"end",3) == 0)    //读取到end,退出线程2  
        {  
            sem_post(&sem1); //信号量sem1 v操作  
            break;  
        }  
  
        sem_post(&sem1); //信号量sem1 v操作  
    }  
  
}  
  
int main()  
{  
    pthread_t t1,t2;
    int ret1,ret2;
  
    if(sem_init(&sem1,0,1) == -1) //初始化信号量sem1  
    {  
        printf("init sem1 error!\n");  
        exit(1);  
    }  
  
    if(sem_init(&sem2,0,0) == -1) //初始化信号量sem2  
    {  
        printf("init sem2 error!\n");  
        exit(1);  
    }  
  
    if(memset(text,0,sizeof(text)) == NULL)  
    {  
        printf("memset error!\n");  
        exit(1);  
    }  
  
    ret1 = pthread_create(&t1,NULL,(void *)write,(void *)text);//创建线程1  
    if(ret1 < 0)  
    {  
        printf("thread1 create error!\n");  
        exit(1);  
    }  
  
    ret2 = pthread_create(&t2,NULL,(void *)read,(void *)text);//创建线程2  
    if(ret2 < 0)  
    {  
        printf("thread2 create error!\n");  
        exit(1);  
    }  
  
    pthread_join(t1,NULL); //等待线程1退出  
    pthread_join(t2,NULL);  
      
    if(sem_destroy(&sem1) == -1) //删除信号量sem1  
    {  
        printf("delete sem1 error!\n");  
        exit(1);  
    }  
      
    if(sem_destroy(&sem2) == -1) //删除信号量sem2  
    {  
        printf("delete sem2 error!\n");  
        exit(1);  
    }  
  
    return 0;  
}  </span>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值