Verrou mutex C++

Verrou Mutex C



C ++ est connu pour être l'un des langages de programmation les plus rapides avec de bonnes performances, une haute précision et un système de gestion de la mémoire adéquat. Ce langage de programmation prend également en charge l'exécution simultanée de plusieurs threads avec le partage de plusieurs ressources entre eux. En multithreading, le thread doit uniquement effectuer l'opération de lecture qui ne pose aucun problème car le thread n'est pas affecté par ce que font les autres threads à ce moment-là. Mais si ces threads devaient partager les ressources entre eux, un thread peut modifier les données à ce moment-là, ce qui pose problème. Pour faire face à ce problème, nous avons le 'Mutex' C++ qui empêche l'accès de plusieurs ressources vers notre code/objet en fournissant la synchronisation qui stipule que l'accès à l'objet/code ne peut être fourni qu'à un seul thread à la fois, afin que plusieurs threads ne puissent pas accéder simultanément à cet objet.

Procédure:

Nous apprendrons comment nous pouvons arrêter l'accès de plusieurs threads à un objet en une seule fois en utilisant le verrouillage mutex. Nous parlerons de la syntaxe du verrou mutex, de ce qu'est le multithreading et de la manière dont nous pouvons traiter les problèmes causés par le multithreading à l'aide du verrou mutex. Ensuite, nous prendrons un exemple de threads multiples et implémenterons le verrou mutex sur eux.







Syntaxe:

Si nous voulons apprendre comment implémenter le verrou mutex afin d'empêcher l'accès simultané de plusieurs threads à notre objet ou code, nous pouvons utiliser la syntaxe suivante :



$ standard :: mutex mut_x

$mut_x. bloquer ( ) ;

Annuler func_name ( ) {

$ // le code que nous voulons cacher des multiples threads serait écrit ici

$mut_x. déverrouille ( ) ;

}

Nous allons maintenant utiliser cette syntaxe sur l'exemple factice et dans le pseudo-code (que nous ne pouvons pas simplement exécuter tel quel dans l'éditeur de code) pour vous faire savoir comment nous pouvons utiliser exactement cette syntaxe comme mentionné dans ce qui suit :



$ standard :: mutex mut_x

Bloc vide ( ) {

$mut_x. bloquer ( ) ;

$ standard :: écoute << 'bonjour' ;

$mut_x. déverrouille ( ) ;

}

Exemple:

Dans cet exemple, essayons d'abord de créer l'opération multithread, puis d'entourer cette opération de verrouillage et déverrouillage mutex pour assurer la synchronisation de l'opération avec le code ou l'objet créé. Mutex traite des conditions de course qui sont des valeurs assez imprévisibles et qui dépendent de la commutation des threads qui sont conscients du temps. Pour implémenter l'exemple de mutex, nous devons d'abord importer les bibliothèques importantes et requises à partir des référentiels. Les bibliothèques requises sont :





$ # inclure

$ # inclure

$ # inclure

La bibliothèque 'iostream' nous fournit une fonction pour afficher les données en tant que Cout, lire les données en tant que Cin et terminer l'instruction en tant que endl. Nous utilisons la bibliothèque 'thread' pour utiliser les programmes ou les fonctions des threads. La bibliothèque 'mutex' nous permet d'implémenter à la fois le verrouillage et le déverrouillage du mutex dans le code. Nous utilisons le '# include' car cela permet à tous les programmes liés à la bibliothèque d'être inclus dans le code.

Maintenant, une fois l'étape précédente terminée, nous définissons la classe mutex ou une variable globale pour le mutex à l'aide de std. Ensuite, nous créons une fonction pour le verrouillage et le déverrouillage du mutex que nous pourrions appeler par la suite dans le code. Dans cet exemple, nous nommons cette fonction bloc. Dans le corps de la fonction de bloc, nous appelons d'abord le 'mutex.lock ()' et commençons à écrire la logique du code.



Le mutex.lock() refuse l'accès des autres threads pour atteindre notre objet ou code créé afin qu'un seul thread puisse lire notre objet à la fois. Dans la logique, nous exécutons une boucle for qui s'exécute sur l'index de 0 à 9. Nous affichons les valeurs dans la boucle. Une fois cette logique créée dans le verrou mutex après son opération ou après avoir quitté la logique, nous appelons la méthode « mutex.unlock() ». Cet appel de méthode nous permet de déverrouiller l'objet créé à partir du verrou mutex puisque l'accès de l'objet à un seul thread a été fourni plus tôt et une fois que l'opération sur cet objet est effectuée par un thread à la fois. Nous voulons maintenant que les autres threads accèdent également à cet objet ou à ce code. Sinon, notre code se déplace dans la situation de 'deadlock' qui fait que l'objet créé avec le mutex reste dans la situation verrouillée pour toujours et aucun autre thread ne pourrait accéder à cet objet. Par conséquent, une opération incomplète continue de s'exécuter. Après cela, nous quittons la fonction de blocage et passons au principal.

Dans l'ensemble, nous affichons simplement notre mutex créé en créant les trois threads à l'aide de 'std :: thread thread_name (appelant ici la fonction de bloc déjà créée dans laquelle nous avons créé le mutex)' avec les noms thread1, thread2 et thread3, etc. De cette façon, les trois threads sont créés. Nous joignons ensuite ces trois threads à exécuter simultanément en appelant le 'thread_name. join()' méthode. Et puis, nous retournons la valeur égale à zéro. L'explication mentionnée précédemment de l'exemple est implémentée sous la forme du code qui peut être représenté dans la figure suivante :

Dans la sortie du code, nous pouvons voir l'exécution et l'affichage des trois threads un par un. Nous pouvons voir même si notre application relève de la catégorie du multithreading. Pourtant, aucun des threads n'a écrasé ou modifié les données et partagé la ressource modifiée en raison de l'implémentation du mutex du 'bloc de fonction'.

Conclusion

Ce guide donne une explication détaillée du concept de la fonction mutex utilisée en C++. Nous avons discuté des applications multithreading, des problèmes que nous rencontrons dans les applications multithreading et de la raison pour laquelle nous devons implémenter le mutex pour les applications multithreading. Nous avons ensuite discuté de la syntaxe du mutex avec l'exemple factice utilisant le pseudo-code. Ensuite, nous avons implémenté un exemple complet sur les applications multithreading avec le mutex sur le studio visuel C++.