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");
}