Sémaphores POSIX en C

Sémaphores POSIX en C

«Bien que chaque langage de programmation ait de nombreuses bibliothèques à des fins spécifiques, la bibliothèque POSIX de C a sa place. Il a été conçu pour créer une grande harmonisation parmi les processus et aide beaucoup à utiliser le multithreading dans les programmes, je.e., Création de plusieurs threads et synchroniser leur exécution. Dans ce guide aujourd'hui, vous verrez une illustration simple de l'utilisation de sémaphores POSIX en C. Pour les exemples de code C de base, nous devons configurer son compilateur dans le système. Mais, avant cela, nous devons mettre à jour le système car c'est une étape nécessaire pour l'exécution fluide du code. Ainsi, la requête affichée dans le snap jointe est un incontournable pour mettre à jour et mettre à niveau votre système d'exploitation Linux avec l'utilitaire «APT»."


Ce processus a nécessité environ 55 Ko d'espace sur votre plate-forme Linux pour effectuer en douceur les mises à jour. Si vous êtes prêt à donner autant d'espace, appuyez sur «Y» pour continuer. Le traitement sera achevé en quelques minutes.


Une fois le système entièrement mis à niveau, nous allons configurer le compilateur du langage C dans notre système avec l'utilitaire APT-Get dans la commande «Installer». Utilisez «GCC» comme mot-clé, et c'est tout.

SEM_INIT ()

Un nouveau sémaphore serait créé lorsqu'il y a déjà un sémaphore non identifié à «S»; Sinon, ce sémaphore déjà existant va être jeté. Tout au long de cette méthode, «S» représente une instance de sémaphore qui a été construite, et partagé est un signal ou un fanion qui indique si le sémaphore peut être distribué avec une méthode fourchue () ou autrement. La valeur d'entrée sert de point de départ du Semaphore.

Int SEM_INIT (SEM_T * S, INT PARTAGE, UNSIGNED INT VALEUR);

SEM_WAIT ()

En exécutant une action de verrouillage du sémaphore sur le sémaphore spécifié par «S», la méthode SEM_WAIT () soutient que le sémaphore. La procédure SEM-Wait sera utilisée pour conserver un sémaphore ou la laisser faire la queue. Certains des processus précédemment surchargés sont éveillés lorsqu'un autre processus invoque SEM_POST ().

int SEM_WAIT (SEM_T * S);

SEM_POST ()

Lorsque le post SEM est appelé, la valeur est augmentée, puis l'une des opérations précédemment sauvegardées ou en attente commence à fonctionner, je.e., déverrouille le sémaphore déjà verrouillé.

int SEM_POST (SEM_T * S);

SEM_DESTROY ()

Un «s» de sémaphore sans nom initialisé est détruit en utilisant la fonction SEM destrument ().

int SEM_DESTROY (SEM_T * S);

Exemple

Pour comprendre les sémaphores, nous allons d'abord créer un fichier C, puis ajouter un code. Pour en créer un, utilisez la requête «Touch» et vous trouverez le nouveau fichier dans le dossier de votre système.


Maintenant, vous devez ouvrir votre fichier C vide avec un éditeur simple pour générer un bon code dedans. Nous avons essayé l'éditeur «Nano» jusqu'à présent, comme le montre le Snap en dessous.


Comme nous le savons tous que tous les langages de programmation ne peuvent pas fonctionner sans bibliothèques car ces bibliothèques détiennent un grand nombre de classes, structures, fonctions et objets à utiliser pour le travail global du système. Nous commençons donc ce programme C avec l'utilisation de certaines bibliothèques de base et incontournables pour les sémaphores POSIX.

Pour utiliser ces bibliothèques dans le code, nous devons utiliser le caractère «#» avec le mot-clé «inclure» pour chaque bibliothèque. À l'heure actuelle, nous avons ajouté un total de 4 bibliothèques qui doivent avoir dans ce programme. Sinon, notre programme ne fonctionnera pas correctement. Le premier «stdio.La bibliothèque d'en-tête h ”est généralement un incontournable dans chaque programme C car il nous permet d'avoir des opérations d'entrée et de sortie dans le code. Par conséquent, nous l'utilisons pour ajouter en douceur les entrées et obtenir des sorties du code. La deuxième bibliothèque que nous utilisons ici est le «pthread.h ”qui est un must pour l'utilisation de la programmation de threads, je.e., multithreading.

Nous utiliserons cette bibliothèque pour créer des threads dans un programme. La bibliothèque suivante et la plus importante de ce code est le «Semaphore.h ”. Il a été utilisé pour synchroniser en douceur les fils. Enfin et surtout, la bibliothèque est «unistd.h », qui nous permet d'utiliser des fonctions et constantes diverses définies par l'utilisateur. Maintenant, nous avons déclaré le sémaphore «S» à l'aide de l'objet intégré «SEM_T» de la bibliothèque de sémaphore. Voici la fonction définie par l'utilisateur de thread «T» sans type de retour. Il a utilisé certaines fonctions de sémaphore intégrées pour effectuer une synchronisation. La fonction SEM_WAIT () est là pour maintenir le sémaphore «S» en utilisant le caractère «&».

Dans le recours, la déclaration printf () a été exécutée avec la fonction «sommeil» pour faire dormir ce programme pendant 4 secondes. Une autre instruction PRINTF () affiche un nouveau message, et la fonction SEM_POST () est exécutée pour libérer le verrou sur Semaphore "S."

#inclure
#inclure
#inclure
#inclure
SEM_T S;
void * t (void * arg)
SEM_WAIT (& S);
printf ("Bienvenue! \ n ");
sommeil (4);
printf ("Bye!\ n ");
SEM_POST (& S);

Voyons bien la méthode principale () de ce programme C pour les sémaphores. La fonction SEM_INIT () a été utilisée ici pour créer un nouveau «S» de sémaphore qui n'a pas été distribué avec une méthode ForkEd (), I.e., «0», et son point de départ est défini sur 1. L'objet Pthread_T de la bibliothèque Pthread de C a été utilisé pour créer deux threads à l'aide de deux objets de thread, O1 et O2. L'instruction printf () est là pour afficher que nous allons créer le premier thread à l'aide de la fonction pthread_create () à la ligne suivante.

Nous avons transmis l'objet O1 Thread à cette fonction avec des restrictions nulles et une fonction d'appel «t» en le faisant passer dans les paramètres. Après un sommeil de 4 secondes, un autre thread a été créé avec l'objet O2, et la fonction pthread_join () est utilisée ici pour rejoindre les threads avec une fonction Main (). La fonction SEM_DESTROY () est là pour détruire le sémaphore «S», et tous les threads bloqués seront également libérés.

int main()
SEM_INIT (& S, 0, 1);
pthread_t o1, o2;
printf ("dans un 1er fil maintenant… \ n");
pthread_create (& o1, null, t, null);
sommeil (4);
printf ("dans un 2ème fil maintenant… \ n");
pthread_create (& o2, null, t, null);
pthread_join (o1, null);
pthread_join (o2, null);
SEM_DESTROY (& S);
retour 0;

Nous compilons le programme C avec le compilateur «GCC»; Les options «-lrt» et «-lpthread» sont utilisées pour exécuter les fonctions de thread POSIX. En fonctionnant le «.un/.requête out, le premier fil a été créé. Il s'endort après avoir imprimé le premier message.


Le deuxième fil a été synchronisé, et après 4 secondes, le premier fil a été libéré, et le deuxième fil a été verrouillé pendant 4 secondes.


En fin de compte, le deuxième fil a également été libéré.

Conclusion

Il s'agit des sémaphores POSIX en C tout en utilisant certaines de ses fonctions principales pour synchroniser différents fils. Après avoir parcouru cet article, vous pourrez comprendre de plus en plus Posix.