sem_init (…): Для чего нужен параметр значения? - PullRequest
9 голосов
/ 21 февраля 2012

В классе нам приходилось использовать семафоры для выполнения работы с потоками.Прототип (и файл заголовка) sem_init имеет следующий вид:

int sem_init (sem_t * sem, int pshared, значение без знака int);

но я не 'Я не понимаю, для чего используется переменная значения.Согласно opengroup.org:

значение является начальным значением для установки семафора на

«значение является значением ...» Как это помогает, чтоэто используется для?

Ответы [ 3 ]

2 голосов
/ 26 января 2017

Значение семафора представляет количество общих ресурсов, доступных для совместного использования между потоками. Если значение больше 0, потоку, вызывающему sem_wait, не нужно ждать. Он просто уменьшает значение на 1 и переходит к доступу к общему ресурсу. sem_post добавит ресурс обратно в пул. Таким образом, оно увеличивает значение на 1. Если значение равно 0, тогда мы будем ждать, пока кто-нибудь не выполнил sem_post.

1 голос
/ 22 июля 2015

Чтобы понять "значение" в sem_init (sem_t * sem, int pshared, unsigned int value)

Я думаю, что нам нужно синхронизировать его с тем, как мы используем семафор в кодах: когда мы хотимдожидаясь семафора, мы вызываем sem_wait (& mutex), и если мы хотим уведомить о запуске sem_wait (& mutex) других потоков, нам нужно вызвать sem_post (& mutex).Но проблема в том, что если никакие другие потоки сначала не вызывают sem_post (& mutex) (при инициализации системы), что должен делать sem_wait (& mutex)?Это должно пройти или ждать, пока другие потоки вызовут sem_post (& mutex)?Ответ находится в «значении» в sem_init ().Если это ноль, это означает, что мы должны ждать, пока некоторые другие потоки вызовут sem_post () один раз, тогда это может пройти.Если это так, то первый вызов sem_wait () в первый раз будет проходить сразу, а второй sem_wait () будет ждать (если во время них не было вызвано sem_post).Таким образом, значение в sem_init () означает, сколько раз мы могли бы выполнить sem_wait () без реального ожидания без использования sem_post ().И мы могли бы рассмотреть sem_wait () как: / тупик, ожидающий, пока значение не будет изменено на значение больше 0 другим потоком /

while (value <= 0) {} </p>

значение -;

И рассмотрим функцию sem_post () как:

значение ++;

1 голос
/ 21 февраля 2012

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

РЕДАКТИРОВАТЬ: семафор имеет значение int, потому что вы будете использовать функцию, такую ​​как sem_wait (sem_t * sem), чтобы уменьшить значение, указывающее на семафор.Если он отрицательный, тогда блокируйте.

...