生产者-消费者问题
- 1 实验内容及要求
- 2 实验环境
- 3 实验设计
- 3.1 问题描述
- 3.2 基本思想
- 3.2.1 生产者线程
- 3.2.2 消费者线程
- 3.2.3 同步的实现
- 3.3 数据结构
- 4 实验源码
- 5 实验结果
- 6 实验总结
1 实验内容及要求
1、模拟生产者—消费者问题;
2、程序要添加适当的注释,程序的书写要采用缩进格式;
3、程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应;
4、程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
2 实验环境
windows 10,Visual Studio 2019
3 实验设计
3.1 问题描述
假设生产者和消费者线程共享一个大小为5的缓冲区。生产者生成新的数字,插入到缓冲区中;消费者不断从缓冲区中取出这些数字。只有缓冲区没满时,生产者才能把消息放入缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。
#mermaid-svg-jCWLH43OJu1CDit7 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-jCWLH43OJu1CDit7 .label text{fill:#333}#mermaid-svg-jCWLH43OJu1CDit7 .node rect,#mermaid-svg-jCWLH43OJu1CDit7 .node circle,#mermaid-svg-jCWLH43OJu1CDit7 .node ellipse,#mermaid-svg-jCWLH43OJu1CDit7 .node polygon,#mermaid-svg-jCWLH43OJu1CDit7 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-jCWLH43OJu1CDit7 .node .label{text-align:center;fill:#333}#mermaid-svg-jCWLH43OJu1CDit7 .node.clickable{cursor:pointer}#mermaid-svg-jCWLH43OJu1CDit7 .arrowheadPath{fill:#333}#mermaid-svg-jCWLH43OJu1CDit7 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-jCWLH43OJu1CDit7 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-jCWLH43OJu1CDit7 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-jCWLH43OJu1CDit7 .edgeLabel rect{opacity:0.9}#mermaid-svg-jCWLH43OJu1CDit7 .edgeLabel span{color:#333}#mermaid-svg-jCWLH43OJu1CDit7 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-jCWLH43OJu1CDit7 .cluster text{fill:#333}#mermaid-svg-jCWLH43OJu1CDit7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-jCWLH43OJu1CDit7 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-jCWLH43OJu1CDit7 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-jCWLH43OJu1CDit7 .actor-line{stroke:grey}#mermaid-svg-jCWLH43OJu1CDit7 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-jCWLH43OJu1CDit7 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-jCWLH43OJu1CDit7 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-jCWLH43OJu1CDit7 .sequenceNumber{fill:#fff}#mermaid-svg-jCWLH43OJu1CDit7 #sequencenumber{fill:#333}#mermaid-svg-jCWLH43OJu1CDit7 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-jCWLH43OJu1CDit7 .messageText{fill:#333;stroke:#333}#mermaid-svg-jCWLH43OJu1CDit7 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-jCWLH43OJu1CDit7 .labelText,#mermaid-svg-jCWLH43OJu1CDit7 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-jCWLH43OJu1CDit7 .loopText,#mermaid-svg-jCWLH43OJu1CDit7 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-jCWLH43OJu1CDit7 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-jCWLH43OJu1CDit7 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-jCWLH43OJu1CDit7 .noteText,#mermaid-svg-jCWLH43OJu1CDit7 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-jCWLH43OJu1CDit7 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-jCWLH43OJu1CDit7 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-jCWLH43OJu1CDit7 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-jCWLH43OJu1CDit7 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-jCWLH43OJu1CDit7 .section{stroke:none;opacity:0.2}#mermaid-svg-jCWLH43OJu1CDit7 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-jCWLH43OJu1CDit7 .section2{fill:#fff400}#mermaid-svg-jCWLH43OJu1CDit7 .section1,#mermaid-svg-jCWLH43OJu1CDit7 .section3{fill:#fff;opacity:0.2}#mermaid-svg-jCWLH43OJu1CDit7 .sectionTitle0{fill:#333}#mermaid-svg-jCWLH43OJu1CDit7 .sectionTitle1{fill:#333}#mermaid-svg-jCWLH43OJu1CDit7 .sectionTitle2{fill:#333}#mermaid-svg-jCWLH43OJu1CDit7 .sectionTitle3{fill:#333}#mermaid-svg-jCWLH43OJu1CDit7 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-jCWLH43OJu1CDit7 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-jCWLH43OJu1CDit7 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-jCWLH43OJu1CDit7 .grid path{stroke-width:0}#mermaid-svg-jCWLH43OJu1CDit7 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-jCWLH43OJu1CDit7 .task{stroke-width:2}#mermaid-svg-jCWLH43OJu1CDit7 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-jCWLH43OJu1CDit7 .taskText:not([font-size]){font-size:11px}#mermaid-svg-jCWLH43OJu1CDit7 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-jCWLH43OJu1CDit7 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-jCWLH43OJu1CDit7 .task.clickable{cursor:pointer}#mermaid-svg-jCWLH43OJu1CDit7 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-jCWLH43OJu1CDit7 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-jCWLH43OJu1CDit7 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-jCWLH43OJu1CDit7 .taskText0,#mermaid-svg-jCWLH43OJu1CDit7 .taskText1,#mermaid-svg-jCWLH43OJu1CDit7 .taskText2,#mermaid-svg-jCWLH43OJu1CDit7 .taskText3{fill:#fff}#mermaid-svg-jCWLH43OJu1CDit7 .task0,#mermaid-svg-jCWLH43OJu1CDit7 .task1,#mermaid-svg-jCWLH43OJu1CDit7 .task2,#mermaid-svg-jCWLH43OJu1CDit7 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-jCWLH43OJu1CDit7 .taskTextOutside0,#mermaid-svg-jCWLH43OJu1CDit7 .taskTextOutside2{fill:#000}#mermaid-svg-jCWLH43OJu1CDit7 .taskTextOutside1,#mermaid-svg-jCWLH43OJu1CDit7 .taskTextOutside3{fill:#000}#mermaid-svg-jCWLH43OJu1CDit7 .active0,#mermaid-svg-jCWLH43OJu1CDit7 .active1,#mermaid-svg-jCWLH43OJu1CDit7 .active2,#mermaid-svg-jCWLH43OJu1CDit7 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-jCWLH43OJu1CDit7 .activeText0,#mermaid-svg-jCWLH43OJu1CDit7 .activeText1,#mermaid-svg-jCWLH43OJu1CDit7 .activeText2,#mermaid-svg-jCWLH43OJu1CDit7 .activeText3{fill:#000 !important}#mermaid-svg-jCWLH43OJu1CDit7 .done0,#mermaid-svg-jCWLH43OJu1CDit7 .done1,#mermaid-svg-jCWLH43OJu1CDit7 .done2,#mermaid-svg-jCWLH43OJu1CDit7 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-jCWLH43OJu1CDit7 .doneText0,#mermaid-svg-jCWLH43OJu1CDit7 .doneText1,#mermaid-svg-jCWLH43OJu1CDit7 .doneText2,#mermaid-svg-jCWLH43OJu1CDit7 .doneText3{fill:#000 !important}#mermaid-svg-jCWLH43OJu1CDit7 .crit0,#mermaid-svg-jCWLH43OJu1CDit7 .crit1,#mermaid-svg-jCWLH43OJu1CDit7 .crit2,#mermaid-svg-jCWLH43OJu1CDit7 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-jCWLH43OJu1CDit7 .activeCrit0,#mermaid-svg-jCWLH43OJu1CDit7 .activeCrit1,#mermaid-svg-jCWLH43OJu1CDit7 .activeCrit2,#mermaid-svg-jCWLH43OJu1CDit7 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-jCWLH43OJu1CDit7 .doneCrit0,#mermaid-svg-jCWLH43OJu1CDit7 .doneCrit1,#mermaid-svg-jCWLH43OJu1CDit7 .doneCrit2,#mermaid-svg-jCWLH43OJu1CDit7 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-jCWLH43OJu1CDit7 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-jCWLH43OJu1CDit7 .milestoneText{font-style:italic}#mermaid-svg-jCWLH43OJu1CDit7 .doneCritText0,#mermaid-svg-jCWLH43OJu1CDit7 .doneCritText1,#mermaid-svg-jCWLH43OJu1CDit7 .doneCritText2,#mermaid-svg-jCWLH43OJu1CDit7 .doneCritText3{fill:#000 !important}#mermaid-svg-jCWLH43OJu1CDit7 .activeCritText0,#mermaid-svg-jCWLH43OJu1CDit7 .activeCritText1,#mermaid-svg-jCWLH43OJu1CDit7 .activeCritText2,#mermaid-svg-jCWLH43OJu1CDit7 .activeCritText3{fill:#000 !important}#mermaid-svg-jCWLH43OJu1CDit7 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-jCWLH43OJu1CDit7 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-jCWLH43OJu1CDit7 g.classGroup text .title{font-weight:bolder}#mermaid-svg-jCWLH43OJu1CDit7 g.clickable{cursor:pointer}#mermaid-svg-jCWLH43OJu1CDit7 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-jCWLH43OJu1CDit7 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-jCWLH43OJu1CDit7 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-jCWLH43OJu1CDit7 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-jCWLH43OJu1CDit7 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-jCWLH43OJu1CDit7 .dashed-line{stroke-dasharray:3}#mermaid-svg-jCWLH43OJu1CDit7 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-jCWLH43OJu1CDit7 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-jCWLH43OJu1CDit7 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-jCWLH43OJu1CDit7 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-jCWLH43OJu1CDit7 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-jCWLH43OJu1CDit7 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-jCWLH43OJu1CDit7 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-jCWLH43OJu1CDit7 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-jCWLH43OJu1CDit7 .commit-id,#mermaid-svg-jCWLH43OJu1CDit7 .commit-msg,#mermaid-svg-jCWLH43OJu1CDit7 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-jCWLH43OJu1CDit7 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-jCWLH43OJu1CDit7 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-jCWLH43OJu1CDit7 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-jCWLH43OJu1CDit7 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-jCWLH43OJu1CDit7 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-jCWLH43OJu1CDit7 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-jCWLH43OJu1CDit7 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-jCWLH43OJu1CDit7 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-jCWLH43OJu1CDit7 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-jCWLH43OJu1CDit7 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-jCWLH43OJu1CDit7 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-jCWLH43OJu1CDit7 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-jCWLH43OJu1CDit7 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-jCWLH43OJu1CDit7 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-jCWLH43OJu1CDit7 .edgeLabel text{fill:#333}#mermaid-svg-jCWLH43OJu1CDit7 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-jCWLH43OJu1CDit7 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-jCWLH43OJu1CDit7 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-jCWLH43OJu1CDit7 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-jCWLH43OJu1CDit7 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-jCWLH43OJu1CDit7 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-jCWLH43OJu1CDit7 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-jCWLH43OJu1CDit7 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-jCWLH43OJu1CDit7 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-jCWLH43OJu1CDit7 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-jCWLH43OJu1CDit7 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-jCWLH43OJu1CDit7 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-jCWLH43OJu1CDit7 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-jCWLH43OJu1CDit7 .note-edge{stroke-dasharray:5}#mermaid-svg-jCWLH43OJu1CDit7 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-jCWLH43OJu1CDit7 .error-icon{fill:#522}#mermaid-svg-jCWLH43OJu1CDit7 .error-text{fill:#522;stroke:#522}#mermaid-svg-jCWLH43OJu1CDit7 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-jCWLH43OJu1CDit7 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-jCWLH43OJu1CDit7 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-jCWLH43OJu1CDit7 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-jCWLH43OJu1CDit7 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-jCWLH43OJu1CDit7 .marker{fill:#333}#mermaid-svg-jCWLH43OJu1CDit7 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-jCWLH43OJu1CDit7 {color: rgba(0, 0, 0, 0.75);font: ;}
生产者
缓冲区
消费者
3.2 基本思想
3.2.1 生产者线程
生产者随机生产20个数据放入缓冲区。具体流程如下:
#mermaid-svg-QBtZoucILrQPZNIh .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-QBtZoucILrQPZNIh .label text{fill:#333}#mermaid-svg-QBtZoucILrQPZNIh .node rect,#mermaid-svg-QBtZoucILrQPZNIh .node circle,#mermaid-svg-QBtZoucILrQPZNIh .node ellipse,#mermaid-svg-QBtZoucILrQPZNIh .node polygon,#mermaid-svg-QBtZoucILrQPZNIh .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-QBtZoucILrQPZNIh .node .label{text-align:center;fill:#333}#mermaid-svg-QBtZoucILrQPZNIh .node.clickable{cursor:pointer}#mermaid-svg-QBtZoucILrQPZNIh .arrowheadPath{fill:#333}#mermaid-svg-QBtZoucILrQPZNIh .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-QBtZoucILrQPZNIh .flowchart-link{stroke:#333;fill:none}#mermaid-svg-QBtZoucILrQPZNIh .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-QBtZoucILrQPZNIh .edgeLabel rect{opacity:0.9}#mermaid-svg-QBtZoucILrQPZNIh .edgeLabel span{color:#333}#mermaid-svg-QBtZoucILrQPZNIh .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-QBtZoucILrQPZNIh .cluster text{fill:#333}#mermaid-svg-QBtZoucILrQPZNIh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-QBtZoucILrQPZNIh .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-QBtZoucILrQPZNIh text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-QBtZoucILrQPZNIh .actor-line{stroke:grey}#mermaid-svg-QBtZoucILrQPZNIh .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-QBtZoucILrQPZNIh .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-QBtZoucILrQPZNIh #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-QBtZoucILrQPZNIh .sequenceNumber{fill:#fff}#mermaid-svg-QBtZoucILrQPZNIh #sequencenumber{fill:#333}#mermaid-svg-QBtZoucILrQPZNIh #crosshead path{fill:#333;stroke:#333}#mermaid-svg-QBtZoucILrQPZNIh .messageText{fill:#333;stroke:#333}#mermaid-svg-QBtZoucILrQPZNIh .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-QBtZoucILrQPZNIh .labelText,#mermaid-svg-QBtZoucILrQPZNIh .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-QBtZoucILrQPZNIh .loopText,#mermaid-svg-QBtZoucILrQPZNIh .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-QBtZoucILrQPZNIh .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-QBtZoucILrQPZNIh .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-QBtZoucILrQPZNIh .noteText,#mermaid-svg-QBtZoucILrQPZNIh .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-QBtZoucILrQPZNIh .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-QBtZoucILrQPZNIh .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-QBtZoucILrQPZNIh .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-QBtZoucILrQPZNIh .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QBtZoucILrQPZNIh .section{stroke:none;opacity:0.2}#mermaid-svg-QBtZoucILrQPZNIh .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-QBtZoucILrQPZNIh .section2{fill:#fff400}#mermaid-svg-QBtZoucILrQPZNIh .section1,#mermaid-svg-QBtZoucILrQPZNIh .section3{fill:#fff;opacity:0.2}#mermaid-svg-QBtZoucILrQPZNIh .sectionTitle0{fill:#333}#mermaid-svg-QBtZoucILrQPZNIh .sectionTitle1{fill:#333}#mermaid-svg-QBtZoucILrQPZNIh .sectionTitle2{fill:#333}#mermaid-svg-QBtZoucILrQPZNIh .sectionTitle3{fill:#333}#mermaid-svg-QBtZoucILrQPZNIh .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QBtZoucILrQPZNIh .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-QBtZoucILrQPZNIh .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QBtZoucILrQPZNIh .grid path{stroke-width:0}#mermaid-svg-QBtZoucILrQPZNIh .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-QBtZoucILrQPZNIh .task{stroke-width:2}#mermaid-svg-QBtZoucILrQPZNIh .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QBtZoucILrQPZNIh .taskText:not([font-size]){font-size:11px}#mermaid-svg-QBtZoucILrQPZNIh .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QBtZoucILrQPZNIh .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-QBtZoucILrQPZNIh .task.clickable{cursor:pointer}#mermaid-svg-QBtZoucILrQPZNIh .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-QBtZoucILrQPZNIh .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-QBtZoucILrQPZNIh .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-QBtZoucILrQPZNIh .taskText0,#mermaid-svg-QBtZoucILrQPZNIh .taskText1,#mermaid-svg-QBtZoucILrQPZNIh .taskText2,#mermaid-svg-QBtZoucILrQPZNIh .taskText3{fill:#fff}#mermaid-svg-QBtZoucILrQPZNIh .task0,#mermaid-svg-QBtZoucILrQPZNIh .task1,#mermaid-svg-QBtZoucILrQPZNIh .task2,#mermaid-svg-QBtZoucILrQPZNIh .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-QBtZoucILrQPZNIh .taskTextOutside0,#mermaid-svg-QBtZoucILrQPZNIh .taskTextOutside2{fill:#000}#mermaid-svg-QBtZoucILrQPZNIh .taskTextOutside1,#mermaid-svg-QBtZoucILrQPZNIh .taskTextOutside3{fill:#000}#mermaid-svg-QBtZoucILrQPZNIh .active0,#mermaid-svg-QBtZoucILrQPZNIh .active1,#mermaid-svg-QBtZoucILrQPZNIh .active2,#mermaid-svg-QBtZoucILrQPZNIh .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-QBtZoucILrQPZNIh .activeText0,#mermaid-svg-QBtZoucILrQPZNIh .activeText1,#mermaid-svg-QBtZoucILrQPZNIh .activeText2,#mermaid-svg-QBtZoucILrQPZNIh .activeText3{fill:#000 !important}#mermaid-svg-QBtZoucILrQPZNIh .done0,#mermaid-svg-QBtZoucILrQPZNIh .done1,#mermaid-svg-QBtZoucILrQPZNIh .done2,#mermaid-svg-QBtZoucILrQPZNIh .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-QBtZoucILrQPZNIh .doneText0,#mermaid-svg-QBtZoucILrQPZNIh .doneText1,#mermaid-svg-QBtZoucILrQPZNIh .doneText2,#mermaid-svg-QBtZoucILrQPZNIh .doneText3{fill:#000 !important}#mermaid-svg-QBtZoucILrQPZNIh .crit0,#mermaid-svg-QBtZoucILrQPZNIh .crit1,#mermaid-svg-QBtZoucILrQPZNIh .crit2,#mermaid-svg-QBtZoucILrQPZNIh .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-QBtZoucILrQPZNIh .activeCrit0,#mermaid-svg-QBtZoucILrQPZNIh .activeCrit1,#mermaid-svg-QBtZoucILrQPZNIh .activeCrit2,#mermaid-svg-QBtZoucILrQPZNIh .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-QBtZoucILrQPZNIh .doneCrit0,#mermaid-svg-QBtZoucILrQPZNIh .doneCrit1,#mermaid-svg-QBtZoucILrQPZNIh .doneCrit2,#mermaid-svg-QBtZoucILrQPZNIh .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-QBtZoucILrQPZNIh .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-QBtZoucILrQPZNIh .milestoneText{font-style:italic}#mermaid-svg-QBtZoucILrQPZNIh .doneCritText0,#mermaid-svg-QBtZoucILrQPZNIh .doneCritText1,#mermaid-svg-QBtZoucILrQPZNIh .doneCritText2,#mermaid-svg-QBtZoucILrQPZNIh .doneCritText3{fill:#000 !important}#mermaid-svg-QBtZoucILrQPZNIh .activeCritText0,#mermaid-svg-QBtZoucILrQPZNIh .activeCritText1,#mermaid-svg-QBtZoucILrQPZNIh .activeCritText2,#mermaid-svg-QBtZoucILrQPZNIh .activeCritText3{fill:#000 !important}#mermaid-svg-QBtZoucILrQPZNIh .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QBtZoucILrQPZNIh g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-QBtZoucILrQPZNIh g.classGroup text .title{font-weight:bolder}#mermaid-svg-QBtZoucILrQPZNIh g.clickable{cursor:pointer}#mermaid-svg-QBtZoucILrQPZNIh g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-QBtZoucILrQPZNIh g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-QBtZoucILrQPZNIh .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-QBtZoucILrQPZNIh .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-QBtZoucILrQPZNIh .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-QBtZoucILrQPZNIh .dashed-line{stroke-dasharray:3}#mermaid-svg-QBtZoucILrQPZNIh #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-QBtZoucILrQPZNIh #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-QBtZoucILrQPZNIh #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-QBtZoucILrQPZNIh #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-QBtZoucILrQPZNIh #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-QBtZoucILrQPZNIh #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-QBtZoucILrQPZNIh #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-QBtZoucILrQPZNIh #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-QBtZoucILrQPZNIh .commit-id,#mermaid-svg-QBtZoucILrQPZNIh .commit-msg,#mermaid-svg-QBtZoucILrQPZNIh .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QBtZoucILrQPZNIh .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QBtZoucILrQPZNIh .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QBtZoucILrQPZNIh g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QBtZoucILrQPZNIh g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-QBtZoucILrQPZNIh g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-QBtZoucILrQPZNIh g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-QBtZoucILrQPZNIh g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-QBtZoucILrQPZNIh g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-QBtZoucILrQPZNIh .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-QBtZoucILrQPZNIh .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-QBtZoucILrQPZNIh .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-QBtZoucILrQPZNIh .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-QBtZoucILrQPZNIh .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-QBtZoucILrQPZNIh .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-QBtZoucILrQPZNIh .edgeLabel text{fill:#333}#mermaid-svg-QBtZoucILrQPZNIh .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-QBtZoucILrQPZNIh .node circle.state-start{fill:black;stroke:black}#mermaid-svg-QBtZoucILrQPZNIh .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-QBtZoucILrQPZNIh #statediagram-barbEnd{fill:#9370db}#mermaid-svg-QBtZoucILrQPZNIh .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-QBtZoucILrQPZNIh .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-QBtZoucILrQPZNIh .statediagram-state .divider{stroke:#9370db}#mermaid-svg-QBtZoucILrQPZNIh .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-QBtZoucILrQPZNIh .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-QBtZoucILrQPZNIh .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-QBtZoucILrQPZNIh .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-QBtZoucILrQPZNIh .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-QBtZoucILrQPZNIh .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-QBtZoucILrQPZNIh .note-edge{stroke-dasharray:5}#mermaid-svg-QBtZoucILrQPZNIh .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-QBtZoucILrQPZNIh .error-icon{fill:#522}#mermaid-svg-QBtZoucILrQPZNIh .error-text{fill:#522;stroke:#522}#mermaid-svg-QBtZoucILrQPZNIh .edge-thickness-normal{stroke-width:2px}#mermaid-svg-QBtZoucILrQPZNIh .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-QBtZoucILrQPZNIh .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-QBtZoucILrQPZNIh .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-QBtZoucILrQPZNIh .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-QBtZoucILrQPZNIh .marker{fill:#333}#mermaid-svg-QBtZoucILrQPZNIh .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-QBtZoucILrQPZNIh {color: rgba(0, 0, 0, 0.75);font: ;}
通过随机数生产数据
获取空缓冲区单元
互斥信号量上锁
将数据放入缓冲区
释放互斥信号量
满缓冲区数加1
3.2.2 消费者线程
从缓冲区中取出20个数据。具体流程如下:
#mermaid-svg-r1x9C7HsF1heU49l .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-r1x9C7HsF1heU49l .label text{fill:#333}#mermaid-svg-r1x9C7HsF1heU49l .node rect,#mermaid-svg-r1x9C7HsF1heU49l .node circle,#mermaid-svg-r1x9C7HsF1heU49l .node ellipse,#mermaid-svg-r1x9C7HsF1heU49l .node polygon,#mermaid-svg-r1x9C7HsF1heU49l .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-r1x9C7HsF1heU49l .node .label{text-align:center;fill:#333}#mermaid-svg-r1x9C7HsF1heU49l .node.clickable{cursor:pointer}#mermaid-svg-r1x9C7HsF1heU49l .arrowheadPath{fill:#333}#mermaid-svg-r1x9C7HsF1heU49l .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-r1x9C7HsF1heU49l .flowchart-link{stroke:#333;fill:none}#mermaid-svg-r1x9C7HsF1heU49l .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-r1x9C7HsF1heU49l .edgeLabel rect{opacity:0.9}#mermaid-svg-r1x9C7HsF1heU49l .edgeLabel span{color:#333}#mermaid-svg-r1x9C7HsF1heU49l .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-r1x9C7HsF1heU49l .cluster text{fill:#333}#mermaid-svg-r1x9C7HsF1heU49l div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-r1x9C7HsF1heU49l .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-r1x9C7HsF1heU49l text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-r1x9C7HsF1heU49l .actor-line{stroke:grey}#mermaid-svg-r1x9C7HsF1heU49l .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-r1x9C7HsF1heU49l .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-r1x9C7HsF1heU49l #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-r1x9C7HsF1heU49l .sequenceNumber{fill:#fff}#mermaid-svg-r1x9C7HsF1heU49l #sequencenumber{fill:#333}#mermaid-svg-r1x9C7HsF1heU49l #crosshead path{fill:#333;stroke:#333}#mermaid-svg-r1x9C7HsF1heU49l .messageText{fill:#333;stroke:#333}#mermaid-svg-r1x9C7HsF1heU49l .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-r1x9C7HsF1heU49l .labelText,#mermaid-svg-r1x9C7HsF1heU49l .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-r1x9C7HsF1heU49l .loopText,#mermaid-svg-r1x9C7HsF1heU49l .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-r1x9C7HsF1heU49l .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-r1x9C7HsF1heU49l .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-r1x9C7HsF1heU49l .noteText,#mermaid-svg-r1x9C7HsF1heU49l .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-r1x9C7HsF1heU49l .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-r1x9C7HsF1heU49l .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-r1x9C7HsF1heU49l .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-r1x9C7HsF1heU49l .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-r1x9C7HsF1heU49l .section{stroke:none;opacity:0.2}#mermaid-svg-r1x9C7HsF1heU49l .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-r1x9C7HsF1heU49l .section2{fill:#fff400}#mermaid-svg-r1x9C7HsF1heU49l .section1,#mermaid-svg-r1x9C7HsF1heU49l .section3{fill:#fff;opacity:0.2}#mermaid-svg-r1x9C7HsF1heU49l .sectionTitle0{fill:#333}#mermaid-svg-r1x9C7HsF1heU49l .sectionTitle1{fill:#333}#mermaid-svg-r1x9C7HsF1heU49l .sectionTitle2{fill:#333}#mermaid-svg-r1x9C7HsF1heU49l .sectionTitle3{fill:#333}#mermaid-svg-r1x9C7HsF1heU49l .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-r1x9C7HsF1heU49l .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-r1x9C7HsF1heU49l .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-r1x9C7HsF1heU49l .grid path{stroke-width:0}#mermaid-svg-r1x9C7HsF1heU49l .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-r1x9C7HsF1heU49l .task{stroke-width:2}#mermaid-svg-r1x9C7HsF1heU49l .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-r1x9C7HsF1heU49l .taskText:not([font-size]){font-size:11px}#mermaid-svg-r1x9C7HsF1heU49l .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-r1x9C7HsF1heU49l .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-r1x9C7HsF1heU49l .task.clickable{cursor:pointer}#mermaid-svg-r1x9C7HsF1heU49l .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-r1x9C7HsF1heU49l .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-r1x9C7HsF1heU49l .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-r1x9C7HsF1heU49l .taskText0,#mermaid-svg-r1x9C7HsF1heU49l .taskText1,#mermaid-svg-r1x9C7HsF1heU49l .taskText2,#mermaid-svg-r1x9C7HsF1heU49l .taskText3{fill:#fff}#mermaid-svg-r1x9C7HsF1heU49l .task0,#mermaid-svg-r1x9C7HsF1heU49l .task1,#mermaid-svg-r1x9C7HsF1heU49l .task2,#mermaid-svg-r1x9C7HsF1heU49l .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-r1x9C7HsF1heU49l .taskTextOutside0,#mermaid-svg-r1x9C7HsF1heU49l .taskTextOutside2{fill:#000}#mermaid-svg-r1x9C7HsF1heU49l .taskTextOutside1,#mermaid-svg-r1x9C7HsF1heU49l .taskTextOutside3{fill:#000}#mermaid-svg-r1x9C7HsF1heU49l .active0,#mermaid-svg-r1x9C7HsF1heU49l .active1,#mermaid-svg-r1x9C7HsF1heU49l .active2,#mermaid-svg-r1x9C7HsF1heU49l .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-r1x9C7HsF1heU49l .activeText0,#mermaid-svg-r1x9C7HsF1heU49l .activeText1,#mermaid-svg-r1x9C7HsF1heU49l .activeText2,#mermaid-svg-r1x9C7HsF1heU49l .activeText3{fill:#000 !important}#mermaid-svg-r1x9C7HsF1heU49l .done0,#mermaid-svg-r1x9C7HsF1heU49l .done1,#mermaid-svg-r1x9C7HsF1heU49l .done2,#mermaid-svg-r1x9C7HsF1heU49l .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-r1x9C7HsF1heU49l .doneText0,#mermaid-svg-r1x9C7HsF1heU49l .doneText1,#mermaid-svg-r1x9C7HsF1heU49l .doneText2,#mermaid-svg-r1x9C7HsF1heU49l .doneText3{fill:#000 !important}#mermaid-svg-r1x9C7HsF1heU49l .crit0,#mermaid-svg-r1x9C7HsF1heU49l .crit1,#mermaid-svg-r1x9C7HsF1heU49l .crit2,#mermaid-svg-r1x9C7HsF1heU49l .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-r1x9C7HsF1heU49l .activeCrit0,#mermaid-svg-r1x9C7HsF1heU49l .activeCrit1,#mermaid-svg-r1x9C7HsF1heU49l .activeCrit2,#mermaid-svg-r1x9C7HsF1heU49l .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-r1x9C7HsF1heU49l .doneCrit0,#mermaid-svg-r1x9C7HsF1heU49l .doneCrit1,#mermaid-svg-r1x9C7HsF1heU49l .doneCrit2,#mermaid-svg-r1x9C7HsF1heU49l .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-r1x9C7HsF1heU49l .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-r1x9C7HsF1heU49l .milestoneText{font-style:italic}#mermaid-svg-r1x9C7HsF1heU49l .doneCritText0,#mermaid-svg-r1x9C7HsF1heU49l .doneCritText1,#mermaid-svg-r1x9C7HsF1heU49l .doneCritText2,#mermaid-svg-r1x9C7HsF1heU49l .doneCritText3{fill:#000 !important}#mermaid-svg-r1x9C7HsF1heU49l .activeCritText0,#mermaid-svg-r1x9C7HsF1heU49l .activeCritText1,#mermaid-svg-r1x9C7HsF1heU49l .activeCritText2,#mermaid-svg-r1x9C7HsF1heU49l .activeCritText3{fill:#000 !important}#mermaid-svg-r1x9C7HsF1heU49l .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-r1x9C7HsF1heU49l g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-r1x9C7HsF1heU49l g.classGroup text .title{font-weight:bolder}#mermaid-svg-r1x9C7HsF1heU49l g.clickable{cursor:pointer}#mermaid-svg-r1x9C7HsF1heU49l g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-r1x9C7HsF1heU49l g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-r1x9C7HsF1heU49l .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-r1x9C7HsF1heU49l .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-r1x9C7HsF1heU49l .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-r1x9C7HsF1heU49l .dashed-line{stroke-dasharray:3}#mermaid-svg-r1x9C7HsF1heU49l #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-r1x9C7HsF1heU49l #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-r1x9C7HsF1heU49l #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-r1x9C7HsF1heU49l #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-r1x9C7HsF1heU49l #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-r1x9C7HsF1heU49l #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-r1x9C7HsF1heU49l #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-r1x9C7HsF1heU49l #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-r1x9C7HsF1heU49l .commit-id,#mermaid-svg-r1x9C7HsF1heU49l .commit-msg,#mermaid-svg-r1x9C7HsF1heU49l .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-r1x9C7HsF1heU49l .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-r1x9C7HsF1heU49l .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-r1x9C7HsF1heU49l g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-r1x9C7HsF1heU49l g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-r1x9C7HsF1heU49l g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-r1x9C7HsF1heU49l g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-r1x9C7HsF1heU49l g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-r1x9C7HsF1heU49l g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-r1x9C7HsF1heU49l .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-r1x9C7HsF1heU49l .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-r1x9C7HsF1heU49l .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-r1x9C7HsF1heU49l .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-r1x9C7HsF1heU49l .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-r1x9C7HsF1heU49l .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-r1x9C7HsF1heU49l .edgeLabel text{fill:#333}#mermaid-svg-r1x9C7HsF1heU49l .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-r1x9C7HsF1heU49l .node circle.state-start{fill:black;stroke:black}#mermaid-svg-r1x9C7HsF1heU49l .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-r1x9C7HsF1heU49l #statediagram-barbEnd{fill:#9370db}#mermaid-svg-r1x9C7HsF1heU49l .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-r1x9C7HsF1heU49l .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-r1x9C7HsF1heU49l .statediagram-state .divider{stroke:#9370db}#mermaid-svg-r1x9C7HsF1heU49l .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-r1x9C7HsF1heU49l .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-r1x9C7HsF1heU49l .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-r1x9C7HsF1heU49l .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-r1x9C7HsF1heU49l .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-r1x9C7HsF1heU49l .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-r1x9C7HsF1heU49l .note-edge{stroke-dasharray:5}#mermaid-svg-r1x9C7HsF1heU49l .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-r1x9C7HsF1heU49l .error-icon{fill:#522}#mermaid-svg-r1x9C7HsF1heU49l .error-text{fill:#522;stroke:#522}#mermaid-svg-r1x9C7HsF1heU49l .edge-thickness-normal{stroke-width:2px}#mermaid-svg-r1x9C7HsF1heU49l .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-r1x9C7HsF1heU49l .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-r1x9C7HsF1heU49l .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-r1x9C7HsF1heU49l .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-r1x9C7HsF1heU49l .marker{fill:#333}#mermaid-svg-r1x9C7HsF1heU49l .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-r1x9C7HsF1heU49l {color: rgba(0, 0, 0, 0.75);font: ;}
获取满缓冲区单元
互斥信号量上锁
从缓冲区取出数据
释放互斥信号量
空缓冲区数加1
3.2.3 同步的实现
C++11中引入的用于多线程操作的thread类,以及线程互斥对象mutex,分别包含在头文件thread和mutex中,可以使生产者和消费者线程同步进行。
3.3 数据结构
定义一个类sbuf,用来构造生产者-消费者程序:
class sbuf {private:int buffer[5]; //缓冲区大小为5int rear; //指向数组最后一个元素mutex mu; //互斥信号量int empty; //空位数int full; //满位数
public:void init(); //初始化void insert(int item); //生产者像缓冲区放入产品void remove(); //消费者从缓冲区取出产品void display(); //显示缓冲区
};
在类中定义了大小为5的数组作为缓冲区,以及同步信号量empty/full和互斥信号量mu。
4 实验源码
1.sbuf.h
#include<iostream>
#include <Windows.h>
#include<mutex>using namespace std;class sbuf {private:int buffer[5]; //缓冲区大小为5int rear; //指向数组最后一个元素mutex mu; //互斥信号量int empty; //记录空位int full; //记录占位
public:void init(); //初始化void insert(int item); //放入产品void remove(); //取出产品void display(); //显示缓冲区
};//初始化
void sbuf::init() {rear = -1;empty = 5;full = 0;
}//放入产品
void sbuf::insert(int item) {while (1) {while (!empty) {}empty -= 1; //P(empty)mu.lock(); //P(mutex)cout << "生产的数为:" << item << endl;buffer[++rear] = item; //产品放入缓冲区display();mu.unlock(); //V(mutex)full += 1; //V(full)break;}
}//取出产品
void sbuf::remove() {int item;while (1) {while (!full) {}full -= 1; //P(full)mu.lock(); //P(mutex) item=buffer[rear--]; //从缓冲区取出产品cout << "消费的数为:" << item << endl;display();mu.unlock(); //V(mutex)empty += 1; //V(empty)break;}
}//显示缓冲区
void sbuf::display() {cout << "缓冲区:";if (rear == -1)cout << "空" << endl;else {for (int i = 0; i <= rear; i++)cout << buffer[i]<<" ";cout << endl;}cout << endl;
}
2.exp1.cpp
#include"sbuf.h"
#include<iostream>
#include<random>
#include <time.h>
#include<thread>
#include <Windows.h>using namespace std;//生产者线程
void producer(sbuf* p) { int item;uniform_int_distribution<unsigned> k(500, 1500);static uniform_int_distribution<unsigned> u(1, 100);static default_random_engine e(time(0)); //随机数引擎for (int i = 0; i < 20; i++) { //生产20次item = u(e);p->insert(item);Sleep(k(e));}
}//消费者线程
void consumer(sbuf* p) {uniform_int_distribution<unsigned> k(1000, 2000);default_random_engine v(time(0)); //随机数引擎for (int i = 0; i < 20; i++) { //消费20次p->remove();Sleep(k(v));}
}int main() {sbuf p;p.init();thread pro(producer, &p); //创建生产者子线程thread con(consumer, &p); //创建消费者子线程pro.join(); //阻塞主线程con.join(); //阻塞主线程cout << "结束!" << endl;return 0;
}
5 实验结果
实验结果截取一部分如下:
6 实验总结
通过本次实验,我对生产者-消费者问题的相关知识有了更加深刻的理解,进一步掌握了进程的同步的相关概念,理解了利用信号量机制解决进程同步问题的基本方法。并且初步掌握了利用C++11中std::thread类多线程编程。
《操作系统实验》C++实现生产者-消费者问题相关推荐
- 作业必备:操作系统实验六【生产者消费者实验:用信号量实现PV操作】
- 【操作系统】Semaphore处理生产者-消费者问题
"生产者-消费者"问题 问题描述 问题分析 关系分析 求解思路 信号量设置 问题解决 复杂情况的求解示例 问题描述 一组生产者进程和一组消费者进程共享一个初始为空.大小为n的缓冲区 ...
- 操作系统 - C语言实现生产者消费者问题
同步互斥问题 - 生产者消费者问题 问题描述: 有多个进程:多个生产者进程和多个消费者进程共享一个初始为空.固定大小为n的缓存(缓冲区).生产者的工作是制造数据,只有缓冲区没满时,生产者才能把消息放入 ...
- 【操作系统】多线程、生产者——消费者同步与互斥代码实现
简述: 两进程同步关系,有两个信号量,一个empty一个full. 假设产品缓冲区大小为n,则初值empty=n,full=0. 前操作(生产者): P(empty) V(full) 后操作( ...
- 超详解“生产者消费者问题”【操作系统】
目录 一.生产者消费者问题(问题描述) 二.问题分析 三.背景知识 四.代码实现 五.实验结论 一.生产者消费者问题(问题描述) 有一个生产者在生产产品,这些产品将提供给一个消费者去消费,为了使生产者 ...
- 北理工操作系统实验合集 | API解读与例子
文章目录 传送门 实验报告与源码下载 前言 进程控制API Linux getpid/getppid fork/vfork exit/_exit exec函数族 wait/waitpid pause/ ...
- 模拟生产者-消费者问题和读者-写者问题
生产者-消费者问题 一组生产者进程生产产品给一组消费者进程消费.一个有n个缓冲区的缓冲池,生产者一次向一个缓冲区中投入消息,消费者从一个缓冲区中取得.生产者--消费者问题实际上是相互合作进程关系的一种 ...
- java信号量生产者_java信号量PV操作 解决生产者-消费者问题
package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...
- 操作系统实验 生产者消费者问题详解
操作系统课程设计 生产者消费者实验报告 一.实验目的 加深对进程概念的理解,明确进程与程序的区别. 认识并发执行的本质. 理解和掌握Linux和Windows进程通信系统调用的功能,通过实验和学习,提 ...
- 操作系统生产者消费者问题实验报告
操作系统实验报告 进程通信 1. 问题描述及需求分析: 问题描述 本次实验实现生产者和消费者之间的通信,即生产者-消费者问题.生产者一次生成一个元素放入缓冲池中,消费者一次可以从缓冲池中取出一个元素. ...
最新文章
- sftp协议下如何上传和下载文件
- python输出命令_Python输出各行命令详解
- Exchange 2010 共享邮箱
- iOS安全之ipa 包重签名的3种方法
- Python Excel操作模块XlsxWriter之插入图片worksheet.insert_image
- 03:Poor Herobrine 直接插入排序
- linux运行python乱码_linux下python中文乱码解决方案详解
- DCMTK:从DICOM封装的PDF存储对象中提取PDF文件
- VIsual Studio编译OpenCV:无法打开python27_d.lib(python36_d.lib)的问题
- (转)分布式锁的几种使用方式(redis、zookeeper、数据库)
- PHP在线定制商城网站源码V3.0
- [vb]FindWindow使用方法
- java 动态代理 jdk为何比cglib效率低 原理总结
- 安装VisualC++出现未安装等错误怎么办
- 不用登录就可以复制 CSDN 代码
- R语言使用epiDisplay包的power.for.2p函数进行效用分析 ( 效能分析、Power analysis)、给定两个样本的比例值(proportions)、样本量计算效用值
- python网站攻击-利用Python进行Web渗透测试(十):密码攻击
- 爬虫第3课 -豆瓣TOP250电影爬取
- 光大祖业 奉子成婚——SAS与SATA-Ⅱ专题
- 瑞典皇家理工学院计算机学什么,瑞典留学 皇家理工学院的学科设置
热门文章
- spring boot缓存初体验
- 任意修改PPT 2007中的剪贴画
- 谭铁牛院士:向生物学习 开启模式识别新突破
- 计算机类文献管理软件,你和学霸只差一款好用的文献管理入门软件
- HTML网页设计期末课程大作业~体育篮球5页面带登录
- Button上面添加一个图片
- 正则表达式 元字符/元符号意义
- C语言:小球垂直下落
- Python学习-8.2 库(第三方库介绍与下载安装)
- 2020华为测试工程师面试前三天面经汇总准备