J'ai une implémentation de cache personnalisée, qui permet de mettre en cache les descendants TCacheable<TKey>
en utilisant l'algorithme de remplacement de cache LRU (les moins récemment utilisés).Comment améliorer l'accès multi-thread au cache (implémentation personnalisée)
Chaque fois qu'un élément est accessible, il est fait barboter jusqu'à la partie supérieure de la file d'attente LRU utilisant la fonction synchronisée suivante:
// a single instance is created to handle all TCacheable<T> elements
public class Cache()
{
private TCacheable<T> oldest, newest;
private object syncQueue = new object();
private void topQueue(TCacheable<T> el)
{
lock (syncQueue)
if (newest != el)
{
if (el.elder != null) el.elder.newer = el.newer;
if (el.newer != null) el.newer.elder = el.elder;
if (oldest == el) oldest = el.newer;
if (oldest == null) oldest = el;
if (newest != null) newest.newer = el;
el.newer = null;
el.elder = newest;
newest = el;
}
}
}
Le goulot d'étranglement dans cette fonction est l'opérateur lock()
, ce qui limite l'accès de la mémoire cache à juste un fil à la fois.
Question: Est-il possible de se débarrasser de lock(syncQueue)
dans cette fonction tout en préservant l'intégrité de la file d'attente?
Le contexte n'est pas clair ici. Comment cette classe est-elle utilisée dans un environnement multithread? Pourquoi la variable que vous utilisez pour verrouiller l'instance n'est-elle pas statique? Est-ce que 'latest 'est statique? À quoi ressemble TCacheable? –
Désolé, a mis à jour le code. La classe Cache implémente un algorithme de cache et une seule instance est construite pour gérer tous les éléments mis en cache. Les variables 'latest',' older', ainsi que 'syncQueue' sont liées à l'instance de cache et se rapportent à la file d'attente qui stocke tous les éléments mis en cache. – Andy
merci pour l'édition. Cependant, la variable 'latest' n'est toujours pas claire. Est-ce statique? –