Problemas de productores y consumidores
# 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, p>
// 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){ p>
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"; p>
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"; p>
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;
}