Concurrència amb pthreads: mutex i variables de condició en un broker

Clasificado en Informática

Escrito el en catalán con un tamaño de 2,78 KB

Mecanismes de concurrència amb pthreads

Definició i inicialització

#define ID_LENGTH 11

pthread_mutex_t mutex;
pthread_cond_t vaciado;
pthread_cond_t llenado;
int lector = 0;

Inicialització dels mecanismes de concurrència

void init_concurrency_mechanisms() { // Inicialitza el control de concurrència

pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&llenado, NULL); // Omplim la cua d'operacions
pthread_cond_init(&vaciado, NULL); // Buidem la cua d'operacions
}

Destrucció dels mecanismes de concurrència

void destroy_concurrency_mechanisms() { // Destrueix el control de concurrència

pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&llenado);
pthread_cond_destroy(&vaciado);
}

Implementació del broker

void* broker(void *args) { // Implementa la funcionalitat del broker

operation oper; // Creem una operació
broker_info br = *(broker_info*)args; // Fem el casting
iterator *it = new_iterator(br.batch_file); // Inicialitzem l'iterador

char id_func[ID_LENGTH];
int price;
int type;
int num_sh;

while (next_operation(it, &id_func[ID_LENGTH], &type, &num_sh, &price) >= 0) { // Llegim una operació

pthread_mutex_lock(&mutex); // Bloquegem la cua

while (operations_queue_full(br.market->stock_operations) == 1 || lector > 0) { // Mentre la cua estigui plena

pthread_cond_wait(&llenado, &mutex); // Esperem (wait)
}

new_operation(&oper, &id_func[ID_LENGTH], type, num_sh, price); // Creem i donem valors a l'operació

int en = enqueue_operation(br.market->stock_operations, &oper); // Encuem l'operació

if (en != 0) {
perror("ERROR\n");
}

pthread_cond_signal(&vaciado);

pthread_mutex_unlock(&mutex); // Alliberem la cua
}

pthread_exit(0);

destroy_iterator(it); // Destruïm l'iterador
}

Implementació de l'executor d'operacions

void* operation_executer(void *args) { // Implementa el processador d'operacions

operation oper; // Crear una operació (operation)
exec_info ex = *(exec_info*)args; // Fem el casting per obtenir la informació de exec_info

while (1) { // Bucle infinit

pthread_mutex_lock(&mutex); // Bloquegem la cua

while (operations_queue_empty(ex.market->stock_operations) == 1 || lector > 0) {
pthread_cond_wait(&vaciado, &mutex);
}

int de = dequeue_operation(ex.market->stock_operations, &oper); // Desencuem l'operació

if (de != 0) { // Si retorna un enter diferent de zero, error
perror("ERROR\n");
}

Entradas relacionadas: