Я хочу использовать мьютекс, который будет использоваться для синхронизации доступа к некоторым переменным, находящимся в общей памяти с двумя различными процессами. Как я могу это достичь. Пример кода для выполнения, который будет очень оценен.
Мьютекс 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;
}