Как создать блокировку в определенном месте в куче, используя библиотеку pthread? - PullRequest
3 голосов
/ 03 октября 2019

Я выделяю память, используя mmap для хранения некоторых данных в ассоциативной манере набора, где я хочу получить доступ к наборам одновременно. Итак, если есть K наборов, то я выделяю K + 1 интервалов для набора, где первый интервал используется для метаданных. Здесь, в начале слота метаданных, я хочу сохранить блокировку. Так как мне создать замок в этом конкретном месте? С помощью оператора sizeof я обнаружил, что размер блокировки равен 40B. Поэтому я удостоверился, что каждая запись по крайней мере 40B.

Обычно мы создаем блокировку pthread, используя

pthread_mutex_t lock;

Итак, безопасно липросто скопировать 40B переменной блокировки в требуемое место?

Так как отладить параллельную программу сложно, было бы здорово, если бы кто-то мог сказать, является ли это правильным способом сделать это. Спасибо.

1 Ответ

5 голосов
/ 03 октября 2019

Копирование объектов синхронизации POSIX никогда не бывает безопасным. Чтобы превратить ячейку памяти в мьютекс, вы можете использовать pthread_mutex_init. Если отображение является общим для процесса, вам нужно создать общий мьютекс, используя атрибут mutex, который был установлен с помощью pthread_mutexattr_setpshared.

В GNU / Linux вы должнысвязать все участвующие процессы с -lpthread (или построить с -pthread), в противном случае программа будет работать, но использовать оптимизированную реализацию мьютекса в libc вместо libpthread, который не поддерживает мьютексы, совместно используемые процессами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...