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) и т.д..