📄 bbpc_sem.c
字号:
<a href="task_Delete.FIND-FUNC">task_Delete</a>(Consumers[i]); } <font color="#6920ac">/* delete Producers */</font> <b>for</b> (i=0; i<<a href="NUM_PRODUCERS.FIND-DEF">NUM_PRODUCERS</a>; i++) { <a href="task_Delete.FIND-FUNC">task_Delete</a>(Producers[i]); } <font color="#6920ac">/* completion message */</font> <a href="printf.FIND-FUNC">printf</a>(<font color="DarkGreen">"%s[%d]: Example: Completed ...\n"</font>, <a href="task_GetName.FIND-FUNC">task_GetName</a>(<a href="task_Self.FIND-FUNC">task_Self</a>()), <a href="task_Self.FIND-FUNC">task_Self</a>()); <a href="task_Sleep.FIND-FUNC">task_Sleep</a>(<a href="TICK_MS_TO_TICKS.FIND-DEF">TICK_MS_TO_TICKS</a>(1000)); <b>return</b>;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font><font color="blue">Error_Exc:</font> <b>return</b>;}<font color="#6920ac">/* The Producer thread */</font><font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="Producer">Producer</a></font></b>(<i>crtx_Void_t</i>){</font><font color="#6920ac">/********************* * LOCAL VARIABLES * *********************/</font> <i>crtx_Uint32_t</i> Item; <i>crtx_Uint32_t</i> Napping;<font color="#6920ac">/********************* * PROCEDURE LOGIC * *********************/</font> <b>while</b>(1) { Item = <a href="rand.FIND-FUNC">rand</a>(); <a href="printf.FIND-FUNC">printf</a>(<font color="DarkGreen">"%s[%d]: produced item %ld\n"</font>, <a href="task_GetName.FIND-FUNC">task_GetName</a>(<a href="task_Self.FIND-FUNC">task_Self</a>()), <a href="task_Self.FIND-FUNC">task_Self</a>(), Item); <a href="#Deposit">Deposit</a>(Item); Napping = <a href="rand.FIND-FUNC">rand</a>()%(1000*<a href="PNAP.FIND-DEF">PNAP</a>); <a href="printf.FIND-FUNC">printf</a>(<font color="DarkGreen">"%s[%d]: deposited item %ld and napping for %ld msecs\n"</font>, <a href="task_GetName.FIND-FUNC">task_GetName</a>(<a href="task_Self.FIND-FUNC">task_Self</a>()), <a href="task_Self.FIND-FUNC">task_Self</a>(), Item, Napping); <a href="task_Sleep.FIND-FUNC">task_Sleep</a>(<a href="TICK_MS_TO_TICKS.FIND-DEF">TICK_MS_TO_TICKS</a>(Napping)); } <b>return</b>;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font> <font color="#6920ac">/* None */</font>}<font color="#6920ac">/* The Consumer thread */</font><font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="Consumer">Consumer</a></font></b>(<i>crtx_Void_t</i>){</font><font color="#6920ac">/********************* * LOCAL VARIABLES * *********************/</font> <i>crtx_Uint32_t</i> Item; <i>crtx_Uint32_t</i> Napping;<font color="#6920ac">/********************* * PROCEDURE LOGIC * *********************/</font> <b>while</b>(1) { <a href="printf.FIND-FUNC">printf</a>(<font color="DarkGreen">"%s[%d]: wants to consume ...\n"</font>, <a href="task_GetName.FIND-FUNC">task_GetName</a>(<a href="task_Self.FIND-FUNC">task_Self</a>()), <a href="task_Self.FIND-FUNC">task_Self</a>()); Item = <a href="#Fetch">Fetch</a>(); Napping = <a href="rand.FIND-FUNC">rand</a>()%(1000*<a href="CNAP.FIND-DEF">CNAP</a>); <a href="printf.FIND-FUNC">printf</a>(<font color="DarkGreen">"%s[%d]: fetched item %ld and napping for %ld msecs\n"</font>, <a href="task_GetName.FIND-FUNC">task_GetName</a>(<a href="task_Self.FIND-FUNC">task_Self</a>()), <a href="task_Self.FIND-FUNC">task_Self</a>(), Item, Napping); <a href="task_Sleep.FIND-FUNC">task_Sleep</a>(<a href="TICK_MS_TO_TICKS.FIND-DEF">TICK_MS_TO_TICKS</a>(Napping)); } <b>return</b>;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font> <font color="#6920ac">/* None */</font>}<font color="#6920ac">/* The bounded buffer deposit routine */</font><font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="Deposit">Deposit</a></font></b>(<i>crtx_Uint32_t</i> Item_a){</font><font color="#6920ac">/********************* * LOCAL VARIABLES * *********************/</font> <font color="#6920ac">/* None */</font><font color="#6920ac">/********************* * PROCEDURE LOGIC * *********************/</font> <a href="sema_Wait.FIND-FUNC">sema_Wait</a>(pSpaces); <font color="#6920ac">/* grab a spare space */</font> <a href="sema_Wait.FIND-FUNC">sema_Wait</a>(pMutex); <font color="#6920ac">/* seize mutex */</font> Buffer[PutIn] = Item_a; <font color="#6920ac">/* put item in buffer */</font> <font color="#6920ac">/* increment PutIn index */</font> PutIn = (PutIn + 1) % <a href="BOUNDED_BUFFER_SIZE.FIND-DEF">BOUNDED_BUFFER_SIZE</a>; Count++; <font color="#6920ac">/* increment items counter */</font> <a href="printf.FIND-FUNC">printf</a>(<font color="DarkGreen">"%s[%d]: Deposit: there are now %d item(s) in the buffer\n"</font>, <a href="task_GetName.FIND-FUNC">task_GetName</a>(<a href="task_Self.FIND-FUNC">task_Self</a>()), <a href="task_Self.FIND-FUNC">task_Self</a>(), Count); <a href="sema_Post.FIND-FUNC">sema_Post</a>(pMutex); <font color="#6920ac">/* release mutex */</font> <a href="sema_Post.FIND-FUNC">sema_Post</a>(pElements); <font color="#6920ac">/* signal that buffer is not empty */</font> <b>return</b>;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font> <font color="#6920ac">/* None */</font>}<font color="#6920ac">/* The bounded buffer fetch routine */</font><font size="+1"><i>crtx_Uint32_t</i> <b><font color="azure1"><a name="Fetch">Fetch</a></font></b>(<i>crtx_Void_t</i>){</font><font color="#6920ac">/********************* * LOCAL VARIABLES * *********************/</font> <i>crtx_Uint32_t</i> Item;<font color="#6920ac">/********************* * PROCEDURE LOGIC * *********************/</font> <a href="sema_Wait.FIND-FUNC">sema_Wait</a>(pElements); <font color="#6920ac">/* take item or wait */</font> <a href="sema_Wait.FIND-FUNC">sema_Wait</a>(pMutex); <font color="#6920ac">/* seize mutex */</font> Item = Buffer[TakeOut]; <font color="#6920ac">/* take item form the buffer */</font> <font color="#6920ac">/* increment TakeOut index */</font> TakeOut = (TakeOut + 1) % <a href="BOUNDED_BUFFER_SIZE.FIND-DEF">BOUNDED_BUFFER_SIZE</a>; Count--; <font color="#6920ac">/* decriment item counter */</font> <a href="printf.FIND-FUNC">printf</a>(<font color="DarkGreen">"%s[%d]: Fetch: there are now %d item(s) in the buffer\n"</font>, <a href="task_GetName.FIND-FUNC">task_GetName</a>(<a href="task_Self.FIND-FUNC">task_Self</a>()), <a href="task_Self.FIND-FUNC">task_Self</a>(), Count); <a href="sema_Post.FIND-FUNC">sema_Post</a>(pMutex); <font color="#6920ac">/* release mutex */</font> <a href="sema_Post.FIND-FUNC">sema_Post</a>(pSpaces); <font color="#6920ac">/* return empty space */</font> <b>return</b> Item;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font> <font color="#6920ac">/* None */</font>}</pre></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -