2015-08-22 3 views
3

Я делаю двоичный семафор, разделяемый между несколькими процессами (а не потоками, только процесс), используя POSIX на языке C. если я создать двоичный семафор, используя семафор,Создание двоичного семафора, разделяемого между несколькими процессами (не потоками, только процессом) с использованием POSIX на языке C

typedef struct BIN_SEMA 
    { 
    pthread_cond_t cv; /* cond. variable 
            - used to block threads */ 
    pthread_mutex_t mutex; /* mutex variable 
          - used to prevents concurrent 
            access to the variable "flag" */ 
    int  flag;   /* Semaphore state: 
            0 = down, 1 = up */ 
    } bin_sema; 

я буду иметь возможность использовать его среди всего нитей, но я хочу поделиться между процессами. , так что мой вопрос: Как сделать бинарный семафор, используя подсчетные семафоры?

+0

Зачем вам * когда-либо * создавать двоичный семафор? Сам 'mutex' * * уже является двоичным семафором. Кроме того, если вы синхронизируете отдельные * процессы *, почему бы вам не использовать соответствующие механизмы для этого: 'sem_open()', 'sem_init()', 'sem_wait()', 'sem_post()', 'sem_unlink() '? – EOF

+0

, но ваши предложенные методы предназначены для подсчета семафора. если я принимаю sem_t * sem_id; затем он создает счетный семафор. и мне нужен двоичный семафор. так задал этот вопрос! – KrunalParmar

+0

Gee, интересно, какой семафор я получу, если бы инициировал счет-семафор с начальным значением 1. – EOF

ответ

2

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

Если вы хотите поделиться семафор через процессы, вы можете использовать именованный семафор ...

sem_t* sem = sem_open("/APP/SEMAPHORE", O_CREAT, (S_IRUSR | S_IWUSR), 1); 

sem_wait(sem); 

// do stuff 

sem_post(sem); 

// do more stuff 

sem_unlink("/APP/SEMAPHORE"); 

Чтобы применить мьютекс через процессы, вы можете использовать файл ...

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); 
+0

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

+0

Зачем вы отправляете сообщение в разблокированный семафор? То, что вы описываете, функционально является мьютезом. – Jason

+0

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

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