Мьютекс interprocess с pthreads

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

Ответ 1

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

sem_t sem;

/* initialize using sem_init or sem_open */

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

Спустя много лет после первоначального размещения этого ответа он должен быть обновлен.

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


R

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

Kuga

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

Ответ 2

Следующий пример демонстрирует создание, использование и уничтожение мьютекса interprocess 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;
}