J'ai trouvé ce code pour comparativatefap code> dans Une réponse sur Stackoverflow :
boolean CompareAndSwapPointer(volatile * void * ptr,
void * new_value,
void * old_value) {
#if defined(_MSC_VER)
if (InterlockedCompareExchange(ptr, new_value, old_value) == old_value) return false;
else return true;
#elif (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100
return __sync_bool_compare_and_swap(ptr, old_value, new_value);
#else
# error No implementation
#endif
}
3 Réponses :
J'utiliserais une couche d'abstraction matérielle forte> forte>, (HAL) qui permet à un code générique d'être courante - et toute source portable peut être incluse et construire pour chaque plate-forme.
À mon avis, ceci Permet une meilleure source structurée et plus lisible. P>
Pour mieux comprendre ce processus, je suggérerais Google pour trouver des exemples et des explications. P>
Espérons que cette brève réponse aide. P>
[modifier] Je tenterai un exemple simple pour Bionix, de montrer comment implémenter un système HAL ... P>
mrramainapplication.c contient les informations suivantes ... p> Il crée ensuite un fichier d'en-tête (rappelez-vous - c'est un exemple, pas de code de travail!) ...
Il crée hal.h ... p> MAJEM A a besoin de deux fichiers source distincts, un pour son système "Tianhe-2" et un autre pour son Amiga 500 ... p> hal_a500.c p> hal_tianhe2_veryfast.c p> M. A alors - lorsque vous construisez L'Amiga - construit mrramainapplication.c et hal_a500.c
Lors de la construction de Tianhe-2 - il utilise hal_tianhe2_veryfast.c au lieu de hal_a500.c p> droite - j'ai écrit cet exemple avec un humour, ce n'est pas marqué oreille à personne, je ne le sens que rend l'exemple plus intéressant et espérons-le au sida à comprendre. p> Neil p> p>
J'ai cherché dans Google, mais tout ce que je trouve est des informations générales sur la façon dont cela fonctionne. Pourriez-vous me donner un lien vers un petit exemple en utilisant le concept hal code>, est-il implémenté à l'aide de
C code> ou
c ++ code>
Je suis désolé Bionox1441, mais je suis au travail - et nous avons un accès restreint à Internet. J'ai remarqué ( Stackoverflow.com/questions/12700909/... ) Cela pourrait au moins vous donner une meilleure compréhension du principal. Je vais regarder ce soir pour de meilleurs exemples si cela n'aide pas.
Si vous pouviez me donner un exemple, chaque fois que vous avez le temps
Voici un exemple - ( Community.Particle.io/T/... ). Ce n'est pas génial - mais ça me fait économiser de tenter de l'expliquer. Si cela n'est toujours pas clair - alors je vais éditer ma réponse pour vous Bionix, merci - Neil
J'ai édité ma réponse pour vous Bionix - c'est très simple et léger - mais devrait expliquer comment les sources dépendantes de la plate-forme sont utilisées avec le code commun. Merci...
Jetez un coup d'œil à Concurrencykit et éventuellement, vous pouvez utiliser des primitives de niveau supérieur qui sont probablement la plupart des gens du temps vraiment vouloir. Contrairement à HAL que Spécifique un peu OS, je crois que CK fonctionne sur Windows et avec un certain nombre de compilateurs non-CCG. P>
Mais si vous êtes simplement intéressé par la manière de mettre en œuvre des actions "comparer-and-swap" ou des actions atomiques sur une grande variété de compilateurs C, regardez et voyez comment ce code fonctionne. C'est tout open-source. p>
Je soupçonne que les détails peuvent devenir désordonnés et ils ne sont pas quelque chose que, en général, fera une exposition facile ou intéressante ici pour le grand public. p>
La concurrence est très spécifique à ces cas concurrents, mais ma question avant qu'elle a été modifiée par un utilisateur est générale non seulement pour comparer et échanger. J'ai utilisé comme exemple de clarification pour le problème que j'ai actuellement
Voir la réponse révisée.
dans moderne C, commençant par C11, utilisez Les versions plus récentes de GCC et de CLIG sont conformes à C11 et mettent en œuvre ces opérations de manière portable. P> _atomic code> pour la qualification de type et
atomic_compare_exchange_weak code> pour la fonction. P>
est le atomic_compare_exchange_weak code> comme rapide que
__ sync_bool_compare_and_swap code>. Le premier est une fonction normale, tandis que la dernière est une méthode code> intégrée code> dans GCC, donc je suppose que le second est plus rapide que le premier.
Microsoft n'utilise pas moderne C - cela ne voudrait pas aider.
@Neil, je pense que ça fait. Il réduit le nombre de cas de plates-formes exotiques pour lesquelles vous devez coder une exception à 1, c'est l'idée des normes. En outre, il existe des implémentations de
@ BIONIX1441, oui, il sera aussi rapide, rappelez-vous que ce sont les mêmes personnes qui enlèvent cela, vos implémentations de compilateur. Et vous vous trompez, ce n'est généralement pas une fonction mais une macro qui se résout à une magie. (Toutes les fonctions de la bibliothèque C peuvent en fait être implémentées comme des macros.)
@Jens ne sont pas ces GCC.GNU.ORG/ OnLineDocs / GCC-4.1.2 / GCC / Atomic-Buildins.html plus rapidement que ceux normaux. Je pensais que ces méthodes de construction étaient similaires à l'expansion des macros en termes de performance
@ BIONIX1441, que voulez-vous dire par "les normales"? Comme je l'ai dit, les interfaces atomic_compare_exchange * code> sont des macros qui résolvent à des choses similaires que ces fonctions intégrées. En tant qu'utilisateur de ces choses, cela ne devrait pas être votre préoccupation. Pensez-y, un agent de confidentialité du compilateur fera tout ce qu'il peut avoir ces opérations efficaces. Étant donné que les gens de la GCC savent faire le
__ buitlin code>, vous pouvez être sûr qu'ils savent également comment implémenter l'interface standard.
@ BIONIX1441, vous semblez également avoir une fausse idée d'efficacité, ici. La contrainte réelle ici en termes de temps est le transfert de bus pouvant atteindre une centaine de cycles d'horloge. Donc, une opération atomique n'est jamais "efficace" dans un sens absolu, mais seulement relativement plus efficace que de verrouiller une section critique avec un mutex, par exemple.
"Est-ce le moyen le plus approprié d'avoir un code rapide portable (à l'exception de l'assemblage d'assemblage)." I> Assemblée en ligne serait extrêmement non i> -Portable.
std :: atomique code> :-)
Je suis actuellement en train d'utiliser c
@Michael tu as raison
@Michael Alors, juste pour moi de comprendre cela pour tous, est l'allusion de l'assemblage dépendant de l'architecture code> ou du compilateur
ou du compilateur code>. Merci