12
votes

SEM_INIT (...): Quel est le paramètre frontal pour?

Dans une classe d'études supérieures, nous avons dû utiliser des sémaphores pour accomplir le travail avec des fils.

Nous avons été dirigés d'utiliser SEM_INIT CODE> avec un groupe d'autres procédures SEM_ *, mais nous n'avons pas reçu beaucoup d'informations sur les détails de chacune de ces méthodes SEM_ *. P>

Le prototype (et le fichier d'en-tête) de sem_init code> est ce qui suit : p>

#include <semaphore.h>

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


0 commentaires

4 Réponses :


1
votes

Je dirais qu'il n'y a pas de différence significative entre la valeur S 1, 2, 5 et ainsi de suite par rapport au paramètre partagé . Il est probablement écrit de cette façon parce que lorsque l'API a été créée pour la première fois, c n'a pas eu de type booléen.


3 commentaires

Alors cela en fait une API obsolète?


Je ne sais pas: il y a de la valeur parfois dans l'utilisation d'une API "essayée et testée" plus ancienne. Vous devriez le regarder du point de vue des choses comme l'efficacité et les défauts de sécurité évidents pour dire si c'était vraiment obsolète ou non


Sneakyness: oui et non. Non dans ces Pthreads, le choix plus moderne, ne semble pas avoir de mise en œuvre du sémaphore, donc pour les cas où vous voulez des sémaphores, c'est l'API que vous devriez utiliser. Oui, dans cela, pour la plupart des cas, les mutiles et les conditions feront une bonne amende à la place des sémaphores.



14
votes

La version glibc de sem_init (ce que vous obtenez si vous man sem_init sous Linux) a ceci à dire:

"L'argument pshared indique si ce sémaphores est d'être partagée entre les fils d'un processus, ou entre les processus. "

pshared est une valeur booléenne: dans la pratique des valeurs significatives qui lui sont transmises sont false ( 0 ) et true ( 1 ), bien que toute valeur non 0 sera considéré comme vrai. Si vous passez 0, vous obtiendrez un sémaphores qui peut être consulté par d'autres threads dans le même processus - essentiellement un verrou en cours. Vous pouvez l'utiliser comme un mutex, ou vous pouvez l'utiliser de façon plus générale pour les propriétés de comptage des ressources d'un sémaphores. On peut dire que si une API pthreads pris en charge sémaphores vous pas besoin de cette caractéristique de sem_init , mais sémaphores dans pthreads de PRECEDE Unix par un peu de temps.

Il serait mieux si le booléen était une sorte d'énumération (par exemple SEM_PROCESS_PRIVATE vs SEM_PROCESS_SHARED ), parce que vous ne l'auriez pas eu cette question, mais sémaphores POSIX sont une API assez vieux que ces choses se passent.


2 commentaires

Ce n'est pas un PC d'appeler cette version comme appartenant à GLIBC. C'est POSIX.1-1-2001.


Vous pouvez utiliser pthread_process_private et pthread_process_shared à partir de pthread.h , ils ont les bonnes valeurs (pas une coïncidence).



1
votes

L'argument frontal indique si ce sémaphore doit être partagé entre les threads d'un processus ou entre les processus.

Si la valeur a la valeur 0, le sémaphore est partagé entre les threads d'un processus et doit être situé à une adresse visible à toutes les threads (par exemple, une variable globale ou une variable allouée de manière dynamique sur le tas. ).

Si maussade est non nulle, le sémaphore est partagé entre les processus et doit être situé dans une région de mémoire partagée (voir shm_open (3), MMAP (2) et shmget (2)). (Étant donné qu'un enfant créé par Fork (2) hérite des mappages de mémoire de ses parents, il peut également accéder au sémaphore.) Tout processus pouvant accéder à la région de mémoire partagée peut fonctionner sur le sémaphore à l'aide de SEM_POST (3), SEM_POST (3), etc. .


0 commentaires

0
votes

L'argument frontal indique si ce sémaphore doit être partagé entre les threads d'un processus ou entre les processus.Si Pshared a la valeur 0, puis le sémaphore est partagé entre les threads d'un processus et doit être situé à certains adresse visible pour tous les threads.Si Pshared est non nulle, puis le sémaphore est partagé entre les pharmacies et doit être situé dans une région de mémoire partagée.


1 commentaires

Quelle est la valeur supplémentaire de cette réponse concernant d'autres réponses ici?