linux生产者,消费者问题

el/2024/7/17 0:12:56

   pthread_cond_wait() :用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread_cond_signal()或pthread_cond_broadcast,把该线程唤醒,使pthread_cond_wait()通过(返回)时,该线程又自动获得该mutex。


  pthread_cond_signal():函数的作用是发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.如果没有线程处在阻塞等待状态,pthread_cond_signal也会成功返回。

  
#include <stdio.h>
#include <pthread.h>
#define MAX 10 //需要生产的数量
pthread_mutex_t the_mutex;
pthread_cond_t condc, condp;
int buffer = 0;//生产者、消费者使用的缓冲区void *producer(void *ptr)
{int i;for(i=1; i<=MAX; i++){pthread_mutex_lock(&the_mutex); //互斥使用缓冲区while(buffer !=0) pthread_cond_wait(&condp, &the_mutex);printf("procucer produce item %d\n",i);buffer = i; //将数据插入缓冲区pthread_cond_signal(&condc);//唤醒消费者pthread_mutex_unlock(&the_mutex);//释放缓冲区}pthread_exit(0);}void *consumer(void *ptr)
{int i;for(i=1; i<=MAX; i++){pthread_mutex_lock(&the_mutex);//互斥使用缓冲区while(buffer ==0) pthread_cond_wait(&condc, &the_mutex);printf("consumer consume item %d\n",i);buffer = 0;//从缓冲区中取出数据pthread_cond_signal(&condp);//唤醒生产者pthread_mutex_unlock(&the_mutex);//释放缓冲区}pthread_exit(0);}int main(int argc, char *argv[])
{pthread_t pro, con;pthread_mutex_init(&the_mutex, 0);pthread_cond_init(&condc,0);pthread_cond_init(&condp,0);pthread_create(&con, 0, consumer, 0);pthread_create(&pro, 0, producer, 0);pthread_join(pro,0);pthread_join(con,0);pthread_cond_destroy(&condc);pthread_cond_destroy(&condp);pthread_mutex_destroy(&the_mutex);return 0;    
}
  

gcc -o consumer-producer -lpthread consumer-producer.c

运行结果:
 
image

http://www.ngui.cc/el/5618083.html

相关文章

可重入函数的深入理解以及printf的可重入性

这个概念在嵌入式操作系统中比较重要&#xff0c;由于存在任务的调度&#xff0c;它实时系统&#xff0c;可剥夺型内核中是危险的&#xff0c;如同一个安静的水雷。可能会被触发&#xff0c;也可能安然无恙。由于它运行结果的不可预期性&#xff0c;会使系统带来隐患。 printf(…

设计一组N个数,确定其中第k个最大值

今天看算法分析是&#xff0c;看到一个这样的问题&#xff0c;就是在一堆数据中查找到第k个大的值。 名称是&#xff1a;设计一组N个数&#xff0c;确定其中第k个最大值&#xff0c;这是一个选择问题&#xff0c;当然&#xff0c;解决这个问题的方法很多&#xff0c;本人在网上…

C++调用C生成的动态库

看下面这个例子&#xff0c;其中add函数是用c编写的代码&#xff0c;而主函数是用c编写的代码&#xff0c;将c代码编译成动态库&#xff0c;然后用c调用。 add.h #ifndef ADD_FILE_HEADER_INC #define ADD_FILE_HEADER_INC #include <stdio.h> #include <malloc.h&…

C语言调用C++库接口的方法概述

最近需要在由纯c语言编写的代码中调用C的动态库&#xff0c;在网上找了一些资料&#xff0c;现在总结下解决方法。 主要的思想就是将C的动态库再封装一层&#xff0c;在这一层编写C语言的函数api&#xff0c;这API中使用C动态库提供的类&#xff1b; 具体例子如下&#xff1a; …

linux多进程共享内存

shmget函数原型 shmget(得到一个共享内存标识符或创建一个共享内存对象) 所需头文件 #include <sys/ipc.h> #include <sys/shm.h> 函数说明 得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符 函数原型 int shmget(key_t key, size_t size, int s…

fork,vfork,clone的区别

fork和clone的区别&#xff1a; Linux将创建进程和执行所创建的进程分为2个阶段。第一个阶段是创建。父进程首先复制子进程&#xff0c;所复制出来的子进程拥有自己的任务结构体和系统堆栈&#xff0c;除此之外所有资源都与父进程共享。Linux提供两种方式复制子进程&#xff1a…

多进程写文件的三种方式

多进程写log&#xff1a; &#xff08;1&#xff09;通过文件加锁的方式&#xff0c;在一个进程访问的时候将文件加锁&#xff0c;处理完了再关闭&#xff0c;不过这种方式会造成文件大频繁操作&#xff0c;导致性能比较低&#xff08;磁盘慢&#xff09;。 另外对于这种方式&a…

父子进程共享的资源

先来看一个题目&#xff1a; 当父进程调用fork()创建子进程之后&#xff0c;下列哪些变量在子进程中修改之后&#xff0c;父进程里也会相应地作出改动&#xff1f; A.全局变量 B.局部变量 C.静态变量 D.文件指针 答案为D&#xff0c;解释如下&#xff1a; fork()子进程和父进…

Linux下IPC总结

IPC进程间通信(Inter-Process Communication)就是指多个进程之间相互通信&#xff0c;交换信息的方法。Linux IPC基本上都是从Unix平台上继承而来的。主要包括最初的Unix IPC&#xff0c;System V IPC以及基于Socket的IPC。另外&#xff0c;Linux也支持POSIX IPC。 System V,BS…

阿里负责人揭秘面试潜规则【转】

最近负责了公司招聘&#xff0c;发现校园招聘这种事情&#xff0c;真是一个奇葩的工作。能做好校园招聘的人&#xff0c;一定是一个矛盾体。 这个人一定是思维缜密&#xff0c;因为流程在这里特别重要&#xff0c;宣讲会、笔试、面试&#xff0c;需要不能出乱子&#xff1b;这个…