Une des difficultés dans l'écriture d'algorithmes ou de structures de données qui garantissent la progression sans verrouillage est l'allocation de mémoire dynamique : appeler quelque chose comme malloc
ou new
n'est pas garanti d'être sans verrou de manière portable. Cependant, de nombreuses implémentations sans verrouillage de malloc
ou new
existent, et il existe également divers allocateurs de mémoire sans verrou pouvant être utilisés pour implémenter des algorithmes/structures de données sans verrou.
Cependant, je ne comprends toujours pas comment cela peut réellement satisfaire complètement les garanties de progression sans verrou, à moins que vous ne limitiez spécifiquement votre structure de données ou algorithme à un pool de mémoire statique pré-alloué. Mais si vous avez besoin d'une allocation de mémoire dynamique, je ne comprends pas comment un éventuel allocateur de mémoire sans verrou peut jamais être vraiment sans verrou à long terme. Le problème est que, peu importe à quel point incroyable peut être votre malloc
ou new
sans verrou, vous finirez par manquer de mémoire, moment où vous devrez demander au système d'exploitation plus de mémoire. Cela signifie qu'au final, vous devrez appeler brk()
ou mmap()
ou autre équivalent de bas niveau pour réellement obtenir accès à plus de mémoire. Et il n'y a tout simplement aucune garantie que aucun de ces appels de bas niveau ne soit implémenté de manière sans verrou.
Il n'y a tout simplement pas de solution à cela (à moins d'utiliser un ancien système d'exploitation comme MS-DOS qui ne fournit pas de protection de mémoire, ou d'écrire votre propre système d'exploitation entièrement sans verrou - deux scénarios qui ne sont pas pratiques ou probables.) Alors, comment un quelconque allocateur de mémoire dynamique peut-il vraiment être sans verrou?