Você está na página 1de 2

//Define uma constante indicando que o buffer ter 100 posies disponveis para //utilizao pelas threads Producer

e Consumer #define N 100 /* number of slots in the buffer */

// Define o tipo semforo como inteiro especial typedef int semaphore; /* semaphores are a special kind of int */

// Cria trs semforos: // 1 - mutex (semforo binrio s pode ter dois estados 0 ou 1), o qual indica // s threads se o buffer pode ser utilizado por elas // 2 empty (= semforo que indica a quantidade de slots livres no buffer, valor inicial = 100): semforo consultado pelas threads do tipo Consumer para saber se existe algum dado a ser recuperado no buffer; // 3 full (= semforo que indica a quantidade de slots ocupados no buffer, valor inicial = 0): semforo consultado pelas threads do tipo Producer, para saberem se ainda existe espao no buffer para insero de dados; semaphore mutex = 1; semaphore empty = N; semaphore full = 0; /* controls access to critical region */ /* counts empty buffer slots */ /* counts full buffer slots */

// Thread do tipo Produtora, que deposita dados na rea crtica (buffer) void producer(void) { // Item a manipular int item; while (TRUE) { produce_item(&item); /* generate next item */

// Decrementa semforo que indica quantidade de slots cheios down(&empty); /* decrement empty count */ // Desliga o semforo binrio (mutex) para que nenhum outra Thread use a rea crtica em questo down(&mutex); /* enter critical region */ // Insere dados no buffer enter_item(item); /* put item in buffer */

// Religa o semforo binrio (mutex), permitindo que outros processos (threads) utilizem a rea crtica up(&mutex); /* leave critical region */ // Incrementa de 1 o contador (semforo) de slots da rea crtica, utilizados up(&full); /* increment count of full slots */ } } // Thread do tipo Consumidora, que recupera dados da rea crtica (buffer) void consumer(void)

{ // Item a manipular int item; while (TRUE) { /* repeat forever */

// Decrementa o semforo (contador) de slots, de forma a indicar s Threads Produtoras que existe espao para elas depositarem mais um dado down(&full); /* decrement count of full slots */

// Desliga a chave de acesso ao buffer, indicando que o mesmo est ocupado e no pode ser utilizado por outra thread down(&mutex); /* enter critical region */ // Recupera dado da rea critica remove_item(&item); /* take item from buffer */ // Religa a chave de controle de uso da rea crtica, de forma a poder ser utilizada por outras threads up(&mutex); /* leave critical region */ // Incrementa o contador de slots vazios, liberando o espao para ser preenchido por uma thread do tipo Produtora up(&empty); /* increment count of full slots */ // Remove um tem da rea crtica consume_item(item); /* use item */ } }

Você também pode gostar