Red de conocimiento informático - Descarga de software - Problemas de productores y consumidores

Problemas de productores y consumidores

# include & ltwindows.h & gt

# include & ltiostream & gt

const unsigned short TAMAÑO _ OF _ BUFFER = 10 // longitud del búfer

ID de producto corto sin firmar = 0; // Número de producto

ID de consumo corto sin firmar = 0; //El número de producto que se consumirá

In = 0 Tipo de entero corto sin signo; El índice del búfer cuando el producto ingresa al búfer.

Unsigned short out = 0; //El índice del búfer cuando el producto sale del búfer.

int g _ BUFFER [tamaño del búfer]; //El búfer es una cola circular.

bool g _ continue = true//Controlar el final del programa

Manejar g _ hMutex//Se utiliza para la exclusión mutua entre subprocesos

Manejar g _ hFullSemaphore //Fuerza al generador a esperar cuando el búfer esté lleno.

Manejar g_hEmptySemaphore//Cuando el búfer está vacío, obliga al usuario a esperar.

Productor DWORD WINAPI (LPVOID); //Hilo productor

Consumidor DWORD WINAPI (LPVOID); //Hilo consumidor

int main()

{

//Crea cada señal mutex.

g_hMutex = CreateMutex(NULL, FALSE, NULL);

g _ hFullSemaphore = CreateSemaphore(NULL, TAMAÑO_OF_BUFFER-1, TAMAÑO_OF_BUFFER-1, NULL

g _ hEmptySemaphore = CreateSemaphore(NULL, 0, SIZE_OF_BUFFER-1, NULL);

//Ajustando los siguientes valores, puede encontrar que cuando el número de productores excede el número de consumidores,

// Con una velocidad de producción rápida, los productores a menudo tienen que esperar a los consumidores; por el contrario, los consumidores tienden a esperar;

const unsigned short PRODUCER_COUNT = 3; //Número de productores

const unsigned short CONSUMERS_COUNT = 1; //Número de consumidores

//Número total de threads

const unsigned short THREADS _ COUNT = PRODUCERS _ COUNT+CONSUMERS _ COUNT;

Procesando hThreads[PRODUCERS _ COUNT] //Procesamiento de cada hilo Handle

DWORD productor id[CONSUMERS _ COUNT]; //Identificador del hilo productor

DWORD consume id[THREADS _ COUNT] //Identificador del hilo consumidor

// Cree un hilo de productor

for(int I = 0;i<producer_count;++i){

hThreads[i ]=CreateThread(NULL, 0, Producer, NULL, 0, & ampproducer id[I]);

if (hThreads[i]==NULL) devuelve -1;

}

//Crear un hilo de consumidor

for(I = 0;i<consumer_count;++i){

hThreads[ PRODUCERS _ COUNT+I]= CreateThread(NULL, 0, Consumer, NULL, 0, & ampconsumer id [I]);

if (hThreads[i]==NULL) devuelve -1;

p>

}

while(g_continue){

If(getchar()){ //Presione Enter para finalizar el programa.

g_continuar=false

}

}

Devuelve 0;

}

//Producir un producto. Simulación simple, solo genera el número de identificación del nuevo producto.

void Produce()

{

STD::cerr <<"Production"<<++ ID del producto <<" . .. "

STD::cerr<<"success"<<STD::endl;

}

//Se producirán nuevos productos en el buffer.

void append()

{

STD::cerr <<"Productos adicionales...";

g_buffer[ in]= ID del producto;

in =(in+1)% TAMAÑO_OF_buff;

STD::cerr<<"éxito" & lt& ltSTD::endl;

//El estado actual del búfer de salida.

for(int I = 0;i<buffer size;++i){

STD::cout<<i<<":" <& ltg_buffer[I];

if(I = = in)STD::cout <<"<-producción";

if(I = = out)STD::cout<<"<——Consumo";

STD::cout<<STD::endl;

}

p>

}

//Obtén un producto de buffer.

Toma no válida()

{

STD::cerr<<"Tomar un producto...";

ID de consumo = g_buffer[out];

out =(out+1)% TAMAÑO_OF_BUFFER;

STD::cerr<<"Éxito”& lt& ltSTD::endl;

//El estado actual del búfer de salida.

for(int I = 0;i<buffer size;++i){

STD::cout<<i<<":" <& ltg_buffer[I];

if(I = = in)STD::cout <<"<-producción";

if(I = = out)STD::cout<<"<——Consumo";

STD::cout<<STD::endl;

}

p>

}

//Producto de consumo

void consumir()

{

STD::cerr & lt; & lt"Consume"& lt& ltConsumeID & lt& lt" ... ";

STD::cerr & lt;& lt"Éxito"& lt& ltSTD::endl;

}

//Productor

DWORD WINAPI generador (LPVOID lpPara)

{

mientras(g_continue){

WaitForSingleObject(g_hFullSemaphore, INFINITE);

WaitForSingleObject(g_hMutex, INFINITO);

producir();

append();

Dormir(1500);

liberar mutex(g _ hMutex

liberar semáforo(g _ hEmptySemaphore, 1, NULL

}

Devuelve 0;

}

//Consumidor

Usuario DWORD WINAPI (LPVOID lpPara)

{

while(g_continue){

WaitForSingleObject( g_hEmptySemaphore, INFINITE);

WaitForSingleObject(g_hMutex, INFINITE);

tomar();

consumir();

dormir( 1500);

liberar mutex(g _ hMutex);

liberar semáforo(g_hFullSemaphore, 1, NULL); Devuelve 0;

}