2015-08-23 1 views
1

Я пытаюсь использовать POSIX counting semaphore как binary semaphore?с использованием счетчика семафора POSIX в виде двоичного семафора

Для этой цели, я написал следующий код

sem = sem_open(argv[optind], flags, perms, 1); // Initialising semaphore to 1 

    while(sem_getvalue(sem) > 0) 
    { 
    continue; 

    } 
    sem_post(sem); 

Существуют ли какие-либо другие методы, чтобы использовать счетный семафор в виде бинарного семафора? Здесь, если коммутация контекста происходит сразу после того, как lopp имеет значение false, и все же sem_post не был вызван, в такой ситуации это не привело бы к состоянию гонки? Есть ли какие-то другие лучшие чувства, чего я пытаюсь достичь.

У меня есть несколько процессов, синхронизированных с sempahore. Я знаю, что этот код не позволяет gurantee сценарию, когда во время sem_getvalue, даже если значение sem становится равным нулю, даже до того, как вызов sem_post в определенном процессе вызывается, процесс anotehr также может вызвать sem_post, указав значение, равное 2. Как такой сценарий может быть разрешен.

Моя проблема не будет решена с помощью мьютекса, как и в моей проблеме, есть процессы, которые используются только для сигнала, т.е. sem_post операции, в отличии от мьютекса, где все процессы будут иметь ожидания и сигнал постоянно

+0

Возможный [дубликат] (https://stackoverflow.com/questions/32156321/making-binary-semaphore-shared-between-multiple-processesnot-threads-process/32158121#32158121). – Jason

ответ

0

Есть некоторые проблемы с кодом, который вы опубликовали.

while(sem_getvalue(sem) > 0) 

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

Следующая проблема заключается в том, что ваша семантика инвертирована. Вы уменьшаетесь и продолжаете, когда семафор больше 0. Кроме того, ваши вызовы не являются атомарными, что вводит ряд условий гонки.

Фактически, вам нужна семантика мьютекса, поскольку есть только два состояния (0/заблокировано и 1/разблокировано). Для этого вы можете либо гарантировать, что sem_post никогда не продолжит sem_wait, или вы можете использовать блокировку файла.

const char* lock_file = ".lock"; 

const int fd_lock = open(lock_file, O_CREAT); 

flock(fd_lock, LOCK_EX); 

// do stuff 

flock(fd_lock, LOCK_UN); 

// do more stuff 

close(fd_lock);  
unlink(lock_file); 

вариант POSIX будет включать fcntl вместо flock.

+0

Не использовал бы блокировку файлов, чтобы замедлить процессы, поскольку операции с файлами создают ненужное отставание. Также здесь могут быть несколько процессов, которые могут выполнять операцию семафорного сигнала. На самом деле есть некоторые процессы, которые будут работать только с сигналом. Таким образом, это не типичная операция мьютекса. –

+0

Спасибо за ваши входы, но я точно ищу решение на основе семафора, а не операцию блокировки файлов. –

+0

Нет, мьютексы, семафоры и блокировки файлов реализованы в ядре, так как процессам необходимо блокировать их. Файлы блокировки обычно пусты, и блокировка/разблокировка не подразумевает ввода-вывода. Как семантика, которую вы описываете, отличается от мьютекса? – Jason

 Смежные вопросы

  • Нет связанных вопросов^_^