Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ожидание 0 для именованного Posix семафора

2.4K
12 февраля 2007 года
Lexogen
70 / / 18.05.2004
Для семафоров System V можна реализовать блокирующую функцию ожидания значения 0 семафора. Можна ли это реализовать для именованных семафоров Posix?
Что бы было, например, так:

sem_wait_null(...); //программа блокируется

Или в Linux можна даную задачу реализовать другим способом?
361
12 февраля 2007 года
Odissey_
661 / / 19.09.2006
Да. Смотри sem_wait() - это для потоков. Уменьшение значения идет на единицу. Есть семафоры и для процессов (аналогичные семафорам System V) - смотри semget и semctl (sys/sem.h). Это аналоги тех же функций, что и в System V.
2.4K
12 февраля 2007 года
Lexogen
70 / / 18.05.2004
Цитата: Odissey_
Да. Смотри sem_wait() - это для потоков. Уменьшение значения идет на единицу.


Уменьшение на единицу не подходит.

Цитата: Odissey_

Есть семафоры и для процессов


Именованные семафоры, о которых я спрашивал - и есть "глобальные" семафоры. Т.е. для процесов.

Цитата: Odissey_

(аналогичные семафорам System V) - смотри semget и semctl (sys/sem.h). Это аналоги тех же функций, что и в System V.


В хидере sys/sem.h объявлены семафоры System V. Это не аналоги. Семафоры Posix - semaphore.h.

361
12 февраля 2007 года
Odissey_
661 / / 19.09.2006
Цитата:
именованные семафоры, о которых я спрашивал - и есть "глобальные" семафоры. Т.е. для процесов


Глобальные семафоры могут быть как именнованные, так и безымянные. Тот же вызов sem_init для неименованных семафоров, имеет поле pshared, которое определяет его "глобальность". Для именованых sem_open.

Цитата:
В хидере sys/sem.h объявлены семафоры System V


Вы правы, именно они, кстати я это упомянул. Но это линух? Линух. Вы же сами спрашивали

Цитата:
Или в Linux можна даную задачу реализовать другим способом?


Ну вот. Можно. Используете теже семафоры System V. Линух их поддерживает.

2.4K
12 февраля 2007 года
Lexogen
70 / / 18.05.2004
Цитата: Odissey_
Глобальные семафоры могут быть как именнованные, так и безымянные. Тот же вызов sem_init для неименованных семафоров, имеет поле pshared, которое определяет его "глобальность". Для именованых sem_open.


Не все так просто. Поле pshared недостаточно для "разшаривания". Нужно плюс его еще разместить в IPC Shared memory.

Цитата: Odissey_

Вы правы, именно они, кстати я это упомянул. Но это линух? Линух. Вы же сами спрашивали

Ну вот. Можно. Используете теже семафоры System V. Линух их поддерживает.


Уже используються. Но в связи с тем, что семафоры Posix намного "легковеснее" и проще в работе нежели System V - есть идея перейти на Posix.
Сейчас просто есть свои реализации паттерна Consumer/Producer, и в одной из реализаций используеться ожидание значения 0 семафора.

361
12 февраля 2007 года
Odissey_
661 / / 19.09.2006
Цитата:
в одной из реализаций используеться ожидание значения 0 семафора.


Так а чем sem_wait -то неподходит?

2.4K
13 февраля 2007 года
Lexogen
70 / / 18.05.2004
Цитата: Odissey_
Так а чем sem_wait -то неподходит?



При вызове sem_wait поток блокируется до того момента, пока значение семафора не станет положительным. Нужно наоборот, что бы при вызове функции поток блокировался пока значения семафора не станет нулевым. Для семафоров SystemV это делаеться просто:

int wait_null(int semid)
{
struct sembuf operations[1];
operations[0].sem_num = 0;
operations[0].sem_op = 0;
operations[0].sem_flg = 0/*SEM_UNDO*/;
return semop(semid,operations,1);
}

Но для Posix семафоров решения я не знаю.

361
13 февраля 2007 года
Odissey_
661 / / 19.09.2006
Думаю возможна блокировка потоков в таком случае через переменную состояния и запрос на состояние семафора sem_trywait.

Что нибудь типа:

 
Код:
pthread_mutex_lock();
while(condition_is_false)  
  pthread_cond_wait();  
pthread_mutex_unlock();
2.4K
13 февраля 2007 года
Lexogen
70 / / 18.05.2004
На такие методы решения я и сам гаразд... Но не буду разводить флуд...
361
13 февраля 2007 года
Odissey_
661 / / 19.09.2006
Ну как решишь, если не трудно будет, выложи. С интересом посмотрю.
8.3K
14 февраля 2007 года
Alexei
6 / / 07.10.2004
ИМХО, чё то у вас нето, если вам приходиться со стандартными средствами париться.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог