1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > linux生产者进程数为3个 linux 多线程面试题_linux 进程线程_linux 线程 进程(3)

linux生产者进程数为3个 linux 多线程面试题_linux 进程线程_linux 线程 进程(3)

时间:2019-12-25 09:54:47

相关推荐

linux生产者进程数为3个 linux 多线程面试题_linux 进程线程_linux 线程 进程(3)

//生产者线程函数

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-/a/jisuanjixue/article-114181-3.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。