Возможно, некоторые демонстрации кода в порядке. Предположив у вас есть заголовок блока следующим образом:
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;
}
Х и функции 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;
}
Вы должны быть осторожны, чтобы убедиться, что вы разблокировать мьютекс даже в возвратных ошибок путей тоже.
Спасибо за ваш ответ. Так что мне просто нужно сохранить значение вместе с блоком, который показывает, если он читается/записывается (функция X & Y)? (Я новичок в мьютексах)? – Alex
@Alex Вам просто нужно вызвать pthread_mutex_lock (mutex), он не вернется, пока мьютекс не станет свободным. – Ben
Вы можете либо иметь значение «pthread_mutex_t» в каждом блоке, либо создать сопоставление от 1 до 1 между блоками памяти и таблицей блокировок. Вы действительно должны стараться избегать разных потоков, требующих доступа к одной и той же памяти, хотя, потому что вы не хотите, чтобы потоки тратили много времени на блокировки. – nategoose