Sem_init (...): для чего нужен параметр pshared?

В классе выпускников нам приходилось использовать семафоры для выполнения работы с потоками.

Нам было предложено использовать sem_init вместе с кучей другой процедуры sem_ *, но нам не была предоставлена ​​много информации о деталях каждого из этих методов sem_ *.

Прототипом (и заголовочным файлом) sem_init является следующее:

#include <semaphore.h>

int sem_init(sem_t *sem, int pshared, unsigned int value);

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

Если аргумент pshared имеет ненулевое значение значение, то семафор разделяется между процессами; в этом случае любые процесс, который может получить доступ к семафору sem может использовать sem для выполнения sem_wait(), sem_trywait(), sem_post(), и sem_destroy().

но я думаю, что я не понимаю разницы между словами 1,2, 10, 25, 50000 и т.д. Я думаю, что он говорит, что если значение равно 0, семафор не используется. (Но тогда какая точка?)

Как я могу использовать этот параметр pshared?

Ответ 1

Версия GLIBC sem_init (что вы получаете, если вы man sem_init в Linux) имеет это:

"Аргумент pshared указывает, должен ли этот семафор быть разделяемых между потоками процесса или между процессами".

So pshared - это логическое значение: на практике значимые значения, переданные ему, это false (0) и true (1), хотя любое значение, отличное от 0, будет считаться истинным. Если вы передадите его 0, вы получите семафор, к которому могут быть доступны другие потоки в одном процессе - по существу, в процессе блокировки. Вы можете использовать это как мьютекс, или вы можете использовать его более широко для свойств подсчета ресурсов семафора. Возможно, если pthreads поддерживают API-интерфейс семафора, вам не понадобится эта функция sem_init, но семафоры в Unix предшествуют pthreads довольно долгое время.

Было бы лучше, если бы логическое было каким-то перечислением (например, SEM_PROCESS_PRIVATE vs SEM_PROCESS_SHARED), потому что тогда у вас не было бы этого вопроса, но семафоры POSIX - довольно старый API, поскольку все это происходит.

Ответ 2

Я бы сказал, что нет существенной разницы между значением s 1, 2, 5 и т.д. относительно параметра shared. Вероятно, это написано именно так, потому что, когда API был впервые создан, C не имел логических типов.

Ответ 3

Аргумент pshared указывает, должен ли этот семафор делиться между потоками процесса или между процессами.

Если pshared имеет значение 0, то семафор разделяется между потоками процесса и должен быть расположен на каком-то адресе, который видим для всех потоков (например, глобальная переменная или переменная, распределенная динамически в куче).

Если pshared отличен от нуля, то семафор разделяется между процессами и должен располагаться в области общей памяти (см. shm_open (3), mmap (2) и shmget (2)). (Так как дочерний элемент, созданный fork (2), наследует его родительские сопоставления памяти, он также может обращаться к семафору.) Любой процесс, который может получить доступ к области разделяемой памяти, может работать на семафоре, используя sem_post (3), sem_wait (3) и т.д..