Межпроцессный мьютекс с потоками - PullRequest
3 голосов
/ 25 июня 2011

Я хочу использовать мьютекс, который будет использоваться для синхронизации доступа к некоторым переменным, находящимся в разделяемой памяти ч / б двух разных процессов.Как я могу этого достичь.Пример кода для выполнения будет очень признателен.

Ответы [ 2 ]

11 голосов
/ 12 февраля 2015

Следующий пример демонстрирует создание, использование и уничтожение мьютекса межпроцессного Pthread.Обобщение примера для нескольких процессов оставлено читателю в качестве упражнения.

#include <pthread.h>

pthread_mutex_t shm_mutex;

int main(void)
{
    int err;
    pthread_mutexattr_t attr;
    err = pthread_mutexattr_init(&attr); if (err) return err;
    err = pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); if (err) return err;
    err = pthread_mutex_init(&shm_mutex, &attr); if (err) return err;
    err = pthread_mutexattr_destroy(&attr); if (err) return err;
    err = pthread_mutex_lock(&shm_mutex); if (err) return err;
    err = pthread_mutex_unlock(&shm_mutex); if (err) return err;
    err = pthread_mutex_destroy(&shm_mutex); if (err) return err;
    return 0;
}
3 голосов
/ 25 июня 2011

Используйте семафор POSIX вместо 1. (см. Ниже). Используйте sem_init для неназванных семафоров или sem_open для именованных.

sem_t sem;

/* initialize using sem_init or sem_open */

sem_wait(&sem);
/* critical region */
sem_post(&sem);

Через много лет после первоначальной публикации этого ответа его необходимо обновить.

На самом деле вместо семафоров должны использоваться мьютексы .Комментарии Р. и Куги (дословно скопированные ниже) объясняют почему.В частности, я нахожу упоминание Куги о том, что мьютексы могут быть post редактируемыми только их наиболее привлекательным потоком блокировки.


R

sem_init требует ненулевого pshared аргумента для совместного использованияТочно так же, как мьютексу потребуется атрибут pshared.Для этого нет причин предпочитать семафоры мьютексам, и на самом деле мьютексы были бы лучше, потому что вы могли бы использовать надежный мьютекс, который позволяет вам обрабатывать (очень реальный!) Случай, когда один процесс умирает, удерживая блокировку.

kuga

Помимо сообщения R... мьютекс может быть опубликован только тем, кто его блокирует.Это часто требуется, и семафор не предоставляет эту функцию.Так что это не правильный ответ, ответ Джеффа должен быть помечен как правильный ответ.

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