Maison > Article > développement back-end > Framework multi-threading C (2) : Mutex mutex et Sem sémaphore
L'exclusion mutuelle et les sémaphores sont les deux fondements de la programmation multi-thread. Je n'entrerai pas dans les détails de leurs principes. Veuillez lire le livre du système d'exploitation ou vérifier en ligne.
Pour la mise en place de l'exclusion mutuelle, quel que soit le système d'exploitation, trois étapes sont indispensables
Initialiser le verrouillage mutex
Opération de verrouillage
Opération de déverrouillage
Pour différents systèmes, il n'y a que quelques différences dans les fonctions implémentées, mais les fonctions sont en réalité similaires. Lors des opérations de verrouillage et de déverrouillage, la plupart des systèmes disposent d'un mécanisme de délai d'attente pour garantir qu'ils ne sont pas toujours verrouillés. un certain temps. À cet endroit, par souci de simplicité du framework, nous n'avons pas défini de délai d'attente. Si nous ne pouvons pas obtenir le verrou pendant l'opération de verrouillage, nous attendrons là pour toujours.
Nous décrivons la classe de base de Mutex comme suit
class CMutex { public: CMutex(const char *pName = NULL); //初始化锁 ~CMutex(); virtual bool Lock()=0; //锁操作,纯虚函数 virtual bool UnLock()=0; //解锁操作,纯虚函数 const char * getName(void) const { return mutex_name; } protected: char *mutex_name; //锁名字 };
Pour la mise en œuvre de chaque système, trois opérations d'initialisation, de verrouillage et de déverrouillage sont nécessaires En partie, sous Linux, ces trois opérations sont très simples, je ne posterai donc pas le code ici.
De même, pour le sémaphore Sem, la mise en œuvre de chaque système est similaire, rien de plus que
Initialisation du sémaphore
Envoi du sémaphore (sémaphore 1)
Réception du sémaphore (Sémaphore -1)
La classe de base Sem est décrite comme suit
class CCountingSem { public: typedef enum { kTimeout, kForever }Mode; CCountingSem(); //初始化信号量 ~CCountingSem(); virtual bool Get() = 0; //接收信号量 virtual bool Post(void) = 0; //发送信号量 };
De même, je ne publierai pas le code pour l’implémentation spécifique.
Bien sûr, pour un système qui satisfait au modèle de conception, lors de la création d'un nouveau mutex et d'un sémaphore, vous ne pouvez bien sûr pas créer directement ces classes, vous devez les renvoyer via un projet simple. , ajoutez les méthodes newMutex et newCountingSem dans la classe COperatingSystemFactory et renvoyez les entités correspondantes via le jugement du système d'exploitation par COperatingSystemFactory.
class COperatingSystemFactory { public: static COperatingSystem *newOperatingSystem(); static CCountingSem *newCountingSem(unsigned int init=0); //参数是信号量的初始值,一般为0 static CMutex *newMutex(const char *pName=NULL); };
D'accord, avec le mutex et le sémaphore, comment l'utiliser dans la fonction principale, on peut d'abord demander le verrouillage mutex et le sémaphore, si on commence ? beaucoup de threads, et si un verrou mutex est nécessaire entre certains d'entre eux, alors nous attribuerons le verrou mutex appliqué au thread correspondant, et nous pourrons ensuite l'utiliser directement. Comme pour chaque classe de thread, vous l'avez écrite vous-même et vous l'avez simplement héritée de CThread. Il va sans dire que les variables membres à l'intérieur sont liées au verrouillage mutex demandé dans main. Vous pouvez également le définir sur une affectation publique. utilisez la fonction définie en privé, tout dépend de vous.
Avec le mutex et le sémaphore, la file d'attente des messages peut être démarrée. Avec la file d'attente des messages, le modèle multi-thread le plus simple est complété.
adresse github :
https://github.com/wyh267/Cplusplus_Thread_Lib
Ce qui précède est le framework multi-threading C (2) :Exclusion mutuelle Mutex et contenu du sémaphore Sem Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !