基于单链表的生产者消费者问题

生产者与消费者问题分析

    原理生产者生产产品,消费者消费产品。产品如果被消费者消费完了,同时生产者又没有生产出产品,消费者             就必须等待。同样的,如果生产者生产了产品,而消费者没有去消费,生产者就要在消费者消费了产品之后再                 生产。生产者和消费者之间既有同步的关系,又存在互斥的部分。


互斥量(Mutex)

     原理互斥量是一个可以处于两态之一的变量:解锁和加锁。互斥量仅仅适用于管理共享资源或一小段代码。获              得锁的线程可以完成“读—修改—写”的操作,然后释放锁给其他线程。没获得锁的线程只能等待而不能访                    问共享数据。“读—修改—写”组成一个原子操作,不会在中间被打断。

     使用方法

                   pthread_mutex_t Mutex;声明Mutex;

                   int pthread_mutex_init(pthread_mutex_t* restrict mutex, const pthread_mutexattr_t *restrict                          attr);初始化Mutex。成功返回0,失败返回错误号;

                  int pthread_mutex_destroy(pthread_mutex_t* mutex);用来销毁由pthread_mutex_init初始化的                         Mutex;

                  如果Mutex变量是静态分配的,也可以用宏定义PTHREAD_MUTEX_INITIALIZER初始化,相当于用                          pthread_mutex_init初始化并且attr参数为NULL;

                  int pthread_mutex_lock(pthread_mutex_t* mutex);获得Mutex完成加锁操作。如果这时另一个线程已                 经获得了这个Mutex,则该线程挂起等待。直到另一个线程释放这个Mutex;

                  int pthread_mutex_trylock(pthread_mutex_t* mutex);如果Mutex已被某个线程获得,该函数失败返回                 EBUSY而不会使线程挂起等待;

                  int pthread_mutex_unlock(pthread_mutex_t* mutex);释放Mutex解锁;

     lock和unlock

                  假设Mutex的值为1表示互斥锁空闲,此时某个线程调用lock可以获得锁,Mutex的值变为0表示互斥锁已                 被某个线程获得,如果其它线程调用lock则挂起等待。

      

条件变量(Condition Variable)

      原理条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包含两个动作:一个线程等待“条件                  变量条件成立”而挂起,另一个线程使“条件成立”(给出条件成立信号)。为了防止竞争,条件变量的使                   用总是和一个互斥锁结合在一起。

     使用方法

                    int pthread_cond_init(pthread_cond_t* restrict cond, const pthread_condattr_t *restrict attr);初                     始化一个条件变量。成功返回0,失败返回错误号;

                    int pthread_cond_destroy(pthread_cond_t* cond);函数销毁一个条件变量;

                    如果cond变量是静态分配的,也可以用宏定义PTHREAD_COND_INITIALIZER初始化,相当于用                             pthread_cond_init初始化并且attr参数为NULL;

                    int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);一个线程                   可以调用这个函数在一个条件变量上阻塞等待。这个函数有三个操作:释放Mutex,阻塞等待,当被唤醒                       时重新获得Mutex并返回;

                    int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict                                     mutex, conststruct timespec *restrict abstime);函数还有一个额外的参数设定等待超时,如果达到了                           abtime所指定的时刻仍没有被别的线程唤醒当前线程,就返回ETIMEDOUT;

                    int pthread_cond_signal(pthread_cond_t *cond);函数唤醒条件变量上另一个等待的线程;

                    int pthread_cond_broadcast(pthread_cond_t *cond);唤醒条件变量上的所有线程;


生产者与消费者问题实现

      「说明生产者生产一个产品放在单链表的表头上,消费者从表头上消费产品。

              

              

              

              

              

              

    运行结果

              

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++智能指针(二)模拟实现三种智能指针

https://blog.csdn.net/nou_camp/article/details/70186721在上一篇博客中提到了Auto_ptr(C智能指针&#xff08;一&#xff09;)&#xff0c;下面进行模拟实现Auto_ptr 采用类模板实现 #include<iostream> using namespace std; template<class T> class Autoptr …

C++智能指针(三)总结

https://blog.csdn.net/nou_camp/article/details/70195795 在上一篇博客中&#xff08;C智能指针&#xff08;二&#xff09;&#xff09;模拟实现了三种智能指针。 其中最好的就是shared_ptr,但是这并不代表它就是最完美的&#xff0c;它也有问题&#xff0c;这个问题就是循环…

c++11 你需要知道这些就够了

https://blog.csdn.net/tangliguantou/article/details/50549751c11新特性举着火把寻找电灯今天我就权当抛砖引玉&#xff0c;如有不解大家一起探讨。有部分内容是引用自互联网上的内容&#xff0c;如有问题请联系我。T&& 右值引用 std::move 右值引用出现之前我们只能…

c++仿函数 functor

https://www.cnblogs.com/decade-dnbc66/p/5347088.html内容整理自国外C教材先考虑一个简单的例子&#xff1a;假设有一个vector<string>&#xff0c;你的任务是统计长度小于5的string的个数&#xff0c;如果使用count_if函数的话&#xff0c;你的代码可能长成这样&#…

Ubuntu软件更新失败

刚安装好Ubuntu以后需要将系统的软件都更新一下&#xff0c;但是遇到一个问题就是下载仓库信息失败&#xff0c;大概是这个样子的错误&#xff1a; 经国遇到这样的问题可以试一下下面这个命令&#xff1a; sudo rm -rf /var/lib/apt/lists/* sudo apt-get update参考网址&…

getsockname函数与getpeername函数的使用

https://www.tuicool.com/articles/V3Aveygetsockname和getpeername函数 getsockname函数用于获取与某个套接字关联的本地协议地址 getpeername函数用于获取与某个套接字关联的外地协议地址 定义如下&#xff1a;[cpp] view plaincopy#include<sys/socket.h> int gets…

Linux命令【一】基本命令

shell命令和bash命令相同&#xff0c;指的是命令解析器 快捷键 history 所有的历史命令ctrl P 向上滚动命令 ctrl N 向下滚动命令 ctrlB将光标向前移动 ctrlF将光标向后移动 ctrlA移动到命令行头部 ctrlE移动到命令行尾部 光标删除操作&#xff1a;删除光标前面字符ctrlh或…

剑指offer面试题:替换空格

https://blog.csdn.net/yanxiaolx/article/details/52235212题目&#xff1a;请实现一个函数&#xff0c;把字符串中的每个空格替换成“%20”。例如输入“We are happy.”&#xff0c;则输出“We%20are%20happy.”。解析&#xff1a;时间复杂度为O(n)的解法。完整代码及测试用例…

数据库原理及应用【一】引言

什么是数据库&#xff1a;一个大规模的集成的数据集合 作用&#xff1a;描述现实世界的实体(entities)以及实体之间的关系 管理数据库的系统软件&#xff1a;DBMS 文件是一个平滑的字符流&#xff0c;无法完成信息的检索和管理 数据&#xff08;data&#xff09;:用来描述现…

用c++模拟实现一个学生成绩管理系统

https://blog.csdn.net/yanxiaolx/article/details/53393437题目&#xff1a;用c模拟实现一个学生成绩的信息管理系统&#xff0c;要求能添加、删除、修改、查看和保存学生的信息等功能 源代码如下:[cpp] view plaincopy#define _CRT_SECURE_NO_WARNINGS #include<iostr…

Python3列表

操作&#xff1a;索引、切片、加、乘、检查成员、确定序列长度、确定最大最小元素 定义&#xff1a; 列表名 [元素]下标列表名[x] 截取:列表名[x:y] 更新&#xff1a; list[x]y 或者使用append()方法添加列表项删除&#xff1a; del list[x]常用操作&#xff1a; 截取与…

Linux惊群效应详解(最详细的了吧)

https://blog.csdn.net/lyztyycode/article/details/78648798?locationNum6&fps1 linux惊群效应详细的介绍什么是惊群&#xff0c;惊群在线程和进程中的具体表现&#xff0c;惊群的系统消耗和惊群的处理方法。1、惊群效应是什么&#xff1f;惊群效应也有人叫做雷鸣群体效应…

epoll原理详解(最清晰)

https://blog.csdn.net/lyztyycode/article/details/79491419我只是把内容搬运过来做个记录&#xff0c;方便自己以后回头看。第一部分&#xff1a;select和epoll的任务关键词&#xff1a;应用程序 文件句柄 用户态 内核态 监控者要比较epoll相比较select高效在什么地方&#x…

Ubuntu卸载软件

用过使用dpkg软件管理工具得到所有已经安装的软件&#xff0c;如果不清楚软件的全名可以使用grep命令进行查找 然后再使用sudo apt-get remove --purge 软件名卸载软件&#xff08;--purge参数会删除配置文件&#xff0c;删的干净一些&#xff09; 例如&#xff1a;

一个重要且实用的signal---SIGCHLD

https://blog.csdn.net/lyztyycode/article/details/78150805SIGCHLD(修改)因为笔者之前的文章里面有错误&#xff0c;今天发现&#xff0c;立马做个修改。在下面我的一段关于sigchld信号相对于直接调用wait函数的好处时&#xff0c;我说调用wait函数要一直检测子进程是否执行完…

Python3函数和代码复用

函数的定义 def 函数名([参数列表]):注释函数体注意事项 函数形参不需要声明类型&#xff0c;可以使用return语句在结束函数执行的同时返回任意类型的值&#xff0c;函数返回值类型与return语句返回表达式i的类型一致 即使该函数不需要接受任何参数&#xff0c;也必须保留一堆…

一文说尽C++赋值运算符重载函数(operator=)

http://www.cnblogs.com/zpcdbky/p/5027481.html在前面&#xff1a;关于C的赋值运算符重载函数(operator)&#xff0c;网络以及各种教材上都有很多介绍&#xff0c;但可惜的是&#xff0c;内容大多雷同且不全面。面对这一局面&#xff0c;在下在整合各种资源及融入个人理解的基…

Python a和a[:]的区别

简单来讲a[:]是深复制&#xff0c;a是浅复制&#xff0c;相当于赋值a的话是赋值了指针&#xff0c;赋值a[:]相当于复制了a对应的那段空间 例如&#xff1a; a [1,1,1,1,1,1]for x in a:if x1:a.remove(x)print(a)运行结果&#xff1a; remove操作是移除序列中第一个x元素。…

Linux系统【二】exec族函数及应用

文件描述符 文件描述符表是一个指针数组&#xff0c;文件描述符是一个整数。 文件描述符表对应的指针是一个结构体&#xff0c;名字为file_struct&#xff0c;里面保存的是已经打开文件的信息 需要注意的是父子进程之间读时共享&#xff0c;写时复制的原则是针对物理地址而言…

白话C++系列(27) -- RTTI:运行时类型识别

http://www.cnblogs.com/kkdd-2013/p/5601783.htmlRTTI—运行时类型识别 RTTI&#xff1a;Run-Time Type Identification。 那么RTTI如何来体现呢&#xff1f;这就要涉及到typeid和dynamic_cast这两个知识点了。为了更好的去理解&#xff0c;那么我们就通过一个例子来说明。这个…