Возможно, какой-то демонстрационный код в порядке. Предположим, у вас есть заголовок блока, например:
struct block {
void *data;
size_t len;
};
Вы бы защитили блок, добавив переменную мьютекса в эту структуру:
struct block {
void *data;
size_t len;
pthread_mutex_t lock;
};
Затем необходимо обновить функцию инициализации для этой структуры, чтобы инициализировать блокировку:
struct block *new_block(size_t len)
{
struct block *b = malloc(sizeof *b);
b->data = malloc(len);
b->len = len;
pthread_mutex_init(&b->lock, NULL);
return b;
}
Функции X и Y (и любая другая функция, которая читает или записывает в блок) затем должны взять блокировку и отпустить ее при выходе:
int x(struct block *b)
{
int retval;
pthread_mutex_lock(&b->lock);
/* code */
pthread_mutex_unlock(&b->lock);
return retval;
}
int y(struct block *b)
{
int retval;
pthread_mutex_lock(&b->lock);
/* code */
pthread_mutex_unlock(&b->lock);
return retval;
}
Вы должны быть осторожны, чтобы гарантировать, что вы разблокируете мьютекс даже в пути возврата ошибки.