//生产者线程函数
unsignedint__stdcallProducerThreadFun(PVOIDpM)
{
for(inti=1;i<=END_PRODUCE_NUMBER;i++)
{
//等待有空的缓冲区出现
WaitForSingleObject(g_hSemaphoreBufferEmpty,INFINITE);
//互斥的访问缓冲区
EnterCriticalSection(&g_cs);
g_Buffer[g_i]=i;
问题描述如下:一个生产者生产出某种 类型的数据(记录、字符),并把它送入缓 冲区(缓冲区为n) ,惟一的一个消费者一 次从缓冲区中取走一个数据,系统要保 证缓冲区操作不发生重叠,即在任一时 刻只能有一方(生产者或消费者)访问缓冲 区。我们看@1行,我们通过make语法建立了一个缓冲为6的int管道,生产者只需要关心生产,把生产好的数据直接扔进管道,消费者呢,不用关心生产者的任何细节,只需要从管道里取数据,生产端和消费端都是阻塞的,当管道为空时,消费端阻塞,当管道满时,生产端阻塞。ti被硬件置1的情况是,当串行发送缓冲寄存器内的数据被通过txd( p3.1 )发送完毕时( 不同的串口方式置1条件不同 )不是指将数据存入串行发送缓冲器中时ti会被置1,同理ri被置1的情况是当rxd( p3.0 )接收到数据将此数据按位存入串行接收缓冲寄存器内完毕时( 不同串口方式置1的条件不同 )不是指从串行接收缓冲寄存器读完数据时ri会被置1。
g_i=(g_i+1)%BUFFER_SIZE;
LeaveCriticalSection(&g_cs);
//通知消费者有新数据了
ReleaseSemaphore(g_hSemaphoreBufferFull,1,NULL);
}
printf(“生产者完成任务,线程结束运行\n”);
return0;
}
//消费者线程函数
unsignedint__stdcallConsumerThreadFun(PVOIDpM)
{
while(true)
{
//等待非空的缓冲区出现
WaitForSingleObject(g_hSemaphoreBufferFull,INFINITE);
//互斥的访问缓冲区
EnterCriticalSection(&g_cs);
SetConsoleColor(FOREGROUND_GREEN);
问题描述如下:一个生产者生产出某种 类型的数据(记录、字符),并把它送入缓 冲区(缓冲区为n) ,惟一的一个消费者一 次从缓冲区中取走一个数据,系统要保 证缓冲区操作不发生重叠,即在任一时 刻只能有一方(生产者或消费者)访问缓冲 区。第六行的含义为:rtsg 向 csam发送了19字节的数据(字节的编号为2到20,传送方向为rtsg到csam). 包中设置了push标志. 在第7行, csam 喊到, 她已经从rtsg中收到了21以下的字节, 但不包括21编号的字节. 这些字节存放在csam的socket的接收缓冲中, 相应地, csam的接收缓冲窗口大小会减少19字节(nt:可以从第5行和第7行win属性值的变化看出来). csam在第7行这个包中也向rtsg发送了一个 字节. 在第8行和第9行, csam 继续向rtsg 分别发送了两个只包含一个字节的数据包, 并且这个数据包带push标志.。我们看@1行,我们通过make语法建立了一个缓冲为6的int管道,生产者只需要关心生产,把生产好的数据直接扔进管道,消费者呢,不用关心生产者的任何细节,只需要从管道里取数据,生产端和消费端都是阻塞的,当管道为空时,消费端阻塞,当管道满时,生产端阻塞。
#define f_lblue foreground_blue //前景蓝。#define f_lbluegreen foreground_blue|foreground_green //前景蓝绿。#define f_lpurple foreground_red|foreground_blue //前景紫。
if(g_Buffer[g_j]==END_PRODUCE_NUMBER)//结束标志
{
LeaveCriticalSection(&g_cs);
//通知其它消费者有新数据了(结束标志)
ReleaseSemaphore(g_hSemaphoreBufferFull,1,NULL);
break;
}
g_j=(g_j+1)%BUFFER_SIZE;
LeaveCriticalSection(&g_cs);
Sleep(50);//someotherworktodo
ReleaseSemaphore(g_hSemaphoreBufferEmpty,1,NULL);
}
SetConsoleColor(FOREGROUND_GREEN);
printf(“编号为%d的消费者收到通知,线程结束运行\n”,GetCurrentThreadId());
SetConsoleColor(FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
return0;
}
intmain()
{
InitializeCriticalSection(&g_cs);
//初始化信号量,一个记录有产品的缓冲区个数,另一个记录空缓冲区个数.
g_hSemaphoreBufferEmpty=CreateSemaphore(NULL,4,4,NULL);
g_hSemaphoreBufferFull=CreateSemaphore(NULL,0,4,NULL);
g_i=0;
g_j=0;
memset(g_Buffer,0,sizeof(g_Buffer));
constintTHREADNUM=3;
HANDLEhThread[THREADNUM];
//生产者线程
hThread[0]=(HANDLE)_beginthreadex(NULL,0,ProducerThreadFun,NULL,0,NULL);
//消费者线程
hThread[1]=(HANDLE)_beginthreadex(NULL,0,ConsumerThreadFun,NULL,0,NULL);
hThread[2]=(HANDLE)_beginthreadex(NULL,0,ConsumerThreadFun,NULL,0,NULL);
WaitForMultipleObjects(THREADNUM,hThread,TRUE,INFINITE);
for(inti=0;i
CloseHandle(hThread[i]);
//销毁信号量和关键段
CloseHandle(g_hSemaphoreBufferEmpty);
CloseHandle(g_hSemaphoreBufferFull);
DeleteCriticalSection(&g_cs);
return0;
}
//1生产者2消费者4缓冲区
#include“stdafx.h”
#include“stdio.h”
#include“stdlib.h”
#include
#include
#include
#include
#include
usingnamespacestd;
//设置控制台输出颜色
BOOLSetConsoleColor(WORDwAttributes)
{
HANDLEhConsole=GetStdHandle(STD_OUTPUT_HANDLE);
if(hConsole==INVALID_HANDLE_VALUE)
returnFALSE;
returnSetConsoleTextAttribute(hConsole,wAttributes);
}
constintEND_PRODUCE_NUMBER=8;//生产产品个数
constintBUFFER_SIZE=4;//缓冲区个数
intg_Buffer[BUFFER_SIZE];//缓冲池
intg_i,g_j;
CRITICAL_SECTIONg_cs;//信号量与关键段
HANDLEg_hSemaphoreBufferEmpty,g_hSemaphoreBufferFull;
//生产者线程函数
unsignedint__stdcallProducerThreadFun(PVOIDpM)
{
for(inti=1;i<=END_PRODUCE_NUMBER;i++)
{
//等待有空的缓冲区出现
WaitForSingleObject(g_hSemaphoreBufferEmpty,INFINITE);
//互斥的访问缓冲区
EnterCriticalSection(&g_cs);
g_Buffer[g_i]=i;
printf(“生产者在缓冲池第%d个缓冲区中投放数据%d\n”,g_i,g_Buffer[g_i]);
g_i=(g_i+1)%BUFFER_SIZE;
LeaveCriticalSection(&g_cs);
//通知消费者有新数据了
ReleaseSemaphore(g_hSemaphoreBufferFull,1,NULL);
}
printf(“生产者完成任务,线程结束运行\n”);
return0;
}
//消费者线程函数
unsignedint__stdcallConsumerThreadFun(PVOIDpM)
{
while(true)
{
//等待非空的缓冲区出现
waitforsingleobject(hcounterin,infinite)。 waitforsingleobject(hmutex,infinite)。 waitforsingleobject(hmutex,infinite)。
//互斥的访问缓冲区
EnterCriticalSection(&g_cs);
SetConsoleColor(FOREGROUND_GREEN);
问题描述如下:一个生产者生产出某种 类型的数据(记录、字符),并把它送入缓 冲区(缓冲区为n) ,惟一的一个消费者一 次从缓冲区中取走一个数据,系统要保 证缓冲区操作不发生重叠,即在任一时 刻只能有一方(生产者或消费者)访问缓冲 区。第六行的含义为:rtsg 向 csam发送了19字节的数据(字节的编号为2到20,传送方向为rtsg到csam). 包中设置了push标志. 在第7行, csam 喊到, 她已经从rtsg中收到了21以下的字节, 但不包括21编号的字节. 这些字节存放在csam的socket的接收缓冲中, 相应地, csam的接收缓冲窗口大小会减少19字节(nt:可以从第5行和第7行win属性值的变化看出来). csam在第7行这个包中也向rtsg发送了一个 字节. 在第8行和第9行, csam 继续向rtsg 分别发送了两个只包含一个字节的数据包, 并且这个数据包带push标志.。我们看@1行,我们通过make语法建立了一个缓冲为6的int管道,生产者只需要关心生产,把生产好的数据直接扔进管道,消费者呢,不用关心生产者的任何细节,只需要从管道里取数据,生产端和消费端都是阻塞的,当管道为空时,消费端阻塞,当管道满时,生产端阻塞。
SetConsoleColor(FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
if(g_Buffer[g_j]==END_PRODUCE_NUMBER)//结束标志
{
LeaveCriticalSection(&g_cs);
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-114181-3.html