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 параметр?

4 ответа

Решение

GLIBC версия sem_init (что вы получите, если вы man sem_init в Linux) есть что сказать:

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

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

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

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

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

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

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

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

Другие вопросы по тегам