生产者-消费者问题

  • 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++实现生产者-消费者问题相关推荐

  1. 作业必备:操作系统实验六【生产者消费者实验:用信号量实现PV操作】

  2. 【操作系统】Semaphore处理生产者-消费者问题

    "生产者-消费者"问题 问题描述 问题分析 关系分析 求解思路 信号量设置 问题解决 复杂情况的求解示例 问题描述 一组生产者进程和一组消费者进程共享一个初始为空.大小为n的缓冲区 ...

  3. 操作系统 - C语言实现生产者消费者问题

    同步互斥问题 - 生产者消费者问题 问题描述: 有多个进程:多个生产者进程和多个消费者进程共享一个初始为空.固定大小为n的缓存(缓冲区).生产者的工作是制造数据,只有缓冲区没满时,生产者才能把消息放入 ...

  4. 【操作系统】多线程、生产者——消费者同步与互斥代码实现

    简述: 两进程同步关系,有两个信号量,一个empty一个full. 假设产品缓冲区大小为n,则初值empty=n,full=0. 前操作(生产者):   P(empty)   V(full) 后操作( ...

  5. 超详解“生产者消费者问题”【操作系统】

    目录 一.生产者消费者问题(问题描述) 二.问题分析 三.背景知识 四.代码实现 五.实验结论 一.生产者消费者问题(问题描述) 有一个生产者在生产产品,这些产品将提供给一个消费者去消费,为了使生产者 ...

  6. 北理工操作系统实验合集 | API解读与例子

    文章目录 传送门 实验报告与源码下载 前言 进程控制API Linux getpid/getppid fork/vfork exit/_exit exec函数族 wait/waitpid pause/ ...

  7. 模拟生产者-消费者问题和读者-写者问题

    生产者-消费者问题 一组生产者进程生产产品给一组消费者进程消费.一个有n个缓冲区的缓冲池,生产者一次向一个缓冲区中投入消息,消费者从一个缓冲区中取得.生产者--消费者问题实际上是相互合作进程关系的一种 ...

  8. java信号量生产者_java信号量PV操作 解决生产者-消费者问题

    package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...

  9. 操作系统实验 生产者消费者问题详解

    操作系统课程设计 生产者消费者实验报告 一.实验目的 加深对进程概念的理解,明确进程与程序的区别. 认识并发执行的本质. 理解和掌握Linux和Windows进程通信系统调用的功能,通过实验和学习,提 ...

  10. 操作系统生产者消费者问题实验报告

    操作系统实验报告 进程通信 1. 问题描述及需求分析: 问题描述 本次实验实现生产者和消费者之间的通信,即生产者-消费者问题.生产者一次生成一个元素放入缓冲池中,消费者一次可以从缓冲池中取出一个元素. ...

最新文章

  1. sftp协议下如何上传和下载文件
  2. python输出命令_Python输出各行命令详解
  3. Exchange 2010 共享邮箱
  4. iOS安全之ipa 包重签名的3种方法
  5. Python Excel操作模块XlsxWriter之插入图片worksheet.insert_image
  6. 03:Poor Herobrine 直接插入排序
  7. linux运行python乱码_linux下python中文乱码解决方案详解
  8. DCMTK:从DICOM封装的PDF存储对象中提取PDF文件
  9. VIsual Studio编译OpenCV:无法打开python27_d.lib(python36_d.lib)的问题
  10. (转)分布式锁的几种使用方式(redis、zookeeper、数据库)
  11. PHP在线定制商城网站源码V3.0
  12. [vb]FindWindow使用方法
  13. java 动态代理 jdk为何比cglib效率低 原理总结
  14. 安装VisualC++出现未安装等错误怎么办
  15. 不用登录就可以复制 CSDN 代码
  16. R语言使用epiDisplay包的power.for.2p函数进行效用分析 ( 效能分析、Power analysis)、给定两个样本的比例值(proportions)、样本量计算效用值
  17. python网站攻击-利用Python进行Web渗透测试(十):密码攻击
  18. 爬虫第3课 -豆瓣TOP250电影爬取
  19. 光大祖业 奉子成婚——SAS与SATA-Ⅱ专题
  20. 瑞典皇家理工学院计算机学什么,瑞典留学 皇家理工学院的学科设置

热门文章

  1. spring boot缓存初体验
  2. 任意修改PPT 2007中的剪贴画
  3. 谭铁牛院士:向生物学习 开启模式识别新突破
  4. 计算机类文献管理软件,你和学霸只差一款好用的文献管理入门软件
  5. HTML网页设计期末课程大作业~体育篮球5页面带登录
  6. Button上面添加一个图片
  7. 正则表达式 元字符/元符号意义
  8. C语言:小球垂直下落
  9. Python学习-8.2 库(第三方库介绍与下载安装)
  10. 2020华为测试工程师面试前三天面经汇总准备