#include #include typedef struct { pthread_mutex_t lock; pthread_cond_t a_cond; pthread_cond_t b_cond; int b_blocked; } Info; Info *initialize_Info() { Info *I; I = (Info *) malloc(sizeof(Info)); pthread_mutex_init(&(I->lock), NULL); pthread_cond_init(&(I->a_cond), NULL); pthread_cond_init(&(I->b_cond), NULL); I->b_blocked = 0; } void safe_modify_data(struct Data *D, Info *I) { pthread_mutex_lock(&(I->lock)); while (!I->b_blocked) pthread_cond_wait(&(I->a_cond), &(I->lock)); modify_data(D); I->b_blocked = 0; pthread_cond_signal(&(I->b_cond)); pthread_mutex_unlock(&(I->lock)); } void BM(Info *I) { pthread_mutex_lock(&(I->lock)); I->b_blocked = 1; pthread_cond_signal(&(I->a_cond)); pthread_cond_wait(&(I->b_cond), &(I->lock)); pthread_mutex_unlock(&(I->lock)); }