Maison  >  Article  >  Opération et maintenance  >  Explication détaillée des exemples Linux sans verrouillage

Explication détaillée des exemples Linux sans verrouillage

零下一度
零下一度original
2017-07-03 15:47:451282parcourir

Quelles opérations prises en charge par Linux sont atomiques ? Connaître ces choses est la base pour comprendre et concevoir des algorithmes de programmation sans verrouillage.

Les éléments suivants sont compilés à partir d'Internet. Merci d'avance pour le partage !

série de commandes sync_fetch_and_add. J'ai trouvé le meilleur article sur cette série de commandes. Les étudiants qui maîtrisent bien l'anglais peuvent accéder directement au texte original. Accès aux types de données simples multithread et variables atomiques

la série sync_fetch_and_add compte un total de douze fonctions, y compris l'addition/soustraction/AND/OR/XOR/etc. La fonction d'opération, sync_fetch_and_add, comme son nom l'indique, récupère d'abord, puis ajoute-la et renvoie la valeur avant de l'ajouter. Prenons count = 4 comme exemple. Après avoir appelé sync_fetch_and_add(&count,1), la valeur de retour est 4, puis le nombre devient 5.
a sync_fetch_and_add, naturellement. Il y a sync_add_and_fetch Haha, la signification de ceci est très claire. Ajoutez-le d'abord puis revenez. La relation entre les deux frères est la même que celle entre i++ et ++i. Quiconque a été violée par Tan Haoqiang ou a reçu de l'argent pour la protection de ses aînés le saura clairement.
Avec cette fonction bébé, nous avons une nouvelle solution. Pour que les multithreads auto-incrémentent la variable globale , nous n'avons plus à nous soucier des verrous de thread. La ligne de code suivante a le même effet que la ligne de code protégée par pthread_mutex ci-dessus, et elle est également thread safe .

sync_fetch_and_add( &global_int, 1 );
Ce qui suit est un portrait de famille de ce groupe de fonctions. Vous pouvez savoir ce que font ces fonctions en regardant. leurs noms.

Lors de la compilation avec gcc, ajoutez l'option -march=i686

// sam:在我的服务器上,发现不加都可以。
type sync_fetch_and_add (type *ptr, type value);type sync_fetch_and_sub (type *ptr, type value);type sync_fetch_and_or (type *ptr, type value);type sync_fetch_and_and (type *ptr, type value);type sync_fetch_and_xor (type *ptr, type value);type sync_fetch_and_nand (type *ptr, type value);type sync_add_and_fetch (type *ptr, type value);type sync_sub_and_fetch (type *ptr, type value);type sync_or_and_fetch (type *ptr, type value);type sync_and_and_fetch (type *ptr, type value);type sync_xor_and_fetch (type *ptr, type value);type sync_nand_and_fetch (type *ptr, type value);

// sam : Je me demande pourquoi les points de suspension sont écrits après. Y a-t-il des paramètres dont nous n'avons pas besoin de nous soucier ? Pas besoin de passer des paramètres lors de son utilisation ? Les deux fonctions suivantes sont exactement ce que je veux et elles peuvent facilement implémenter la fonction de verrouillage mutex.

bool sync_bool_compare_and_swap (tapez*ptr, tapez oldval, tapez newval, ...)
tapez sync_val_compare_and_swap (tapez *ptr, tapez oldval, tapez newval , ...)
Ces deux fonctions fournissent une comparaison et un échange atomiques. Si *ptr == oldval, écrivez newval dans *ptr,
Non. vrai si égal et écrit
La deuxième fonction renvoie la valeur avant l'opération.

sync_synchronize (...)

Pour comprendre ce qui précède, veuillez vous référer à : blog.sunchangming.com/post/47188394133
Il existe deux autres fonctions :
tapez sync_lock_test_and_set (tapez *ptr, tapez valeur, ...)
Définissez *ptr sur valeur et renvoie la valeur avant l'opération *ptr.
void sync_lock_release (tapez *ptr, ...)
Définissez *ptr sur 0

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn