Disons que j'ai le code suivant:mémoire de C Commande Cohérence
void* p0 = nullptr;
void* p1 = alloc_some_data();
void f1() {
p0 = p1;
p1 = nullptr;
}
On suppose que f1
est exécuté sur un fil 1. Est-il possible que (en laissant le code tel qu'il est) un autre thread peut à un certain point, voir p0
et p1
comme nullptr
(si le compilateur ou le matériel réorganise les instructions telles que la deuxième assignation avant la première)?
La raison pour laquelle je pose cette question est parce que je veux implémenter un garbage collector et je veux savoir si j'ai besoin d'accéder aux pointeurs du thread GC utilisant des instructions atomiques (std::atomic
). Il n'y a pas de problème si le thread GC voit p0 == p1 == alloc_some_data()
mais il y aura des problèmes si le thread GC voit p0 == p1 == nullptr
car il signalera alors les données précédemment dans p1 comme inaccessibles quand il est clairement accessible.
D'après ce que je comprends, l'avantage de tracer gc sur le comptage de ref évite les verrous (par incréments de refs). Si chaque mise à jour de référence dans un thread mutateur nécessite un verrou mutex, alors où est le gain de performance par rapport au comptage de ref? L'approche de traçage gc blote alors le chemin du code avec des verrous comme les méthodes de comptage de ref (dans les threads de mutateur), n'est-ce pas? Est-il possible d'écrire un gc de traçage où les threads mutateurs peuvent mettre à jour une référence avec une simple instruction MOV? Quelqu'un peut-il me diriger vers une direction (un article ou un livre ...)? –
Je ne connais pas assez la garbage collection pour commenter. Personnellement, j'aime le comptage de références parce que la mémoire est libérée le plus tôt possible. Certains systèmes d'exploitation fournissent des instructions d'incrémentation et de décrémentation atomiques beaucoup plus rapides que l'utilisation de mutex. Dans de tels cas, le comptage de référence gagne. Si vous utilisez Windows/Visual Studio, vous pouvez jeter un oeil à la sémantique 'volatile' spécifique à Microsoft. – paddy
@DaniloCarvalho: Je ne connais pas très bien le GC, mais de nombreux GC qui ne sont pas référencés sont * stop-the-world * GC: l'environnement arrêtera tous les threads, effectuera GC (relocalisation des objets et mise à jour des pointeurs) tous les threads continuent. –