Dans le code multithread, lorsqu'une instance peut être lue ou écrite par plusieurs threads, elle doit être verrouillée pour effectuer ces opérations en toute sécurité.Faciliter le verrouillage dans les MTA
Pour éviter la répétition de la création d'un objet sur lequel verrouiller et écrire un tas d'instructions de verrouillage par le code, j'ai créé une classe générique pour gérer le verrouillage.
Est-ce que quelque chose me manque, conceptuellement? Cela devrait fonctionner, non?
public class Locked<T> where T : new()
{
private readonly object locker = new object();
private T value;
public Locked()
: this(default(T))
{ }
public Locked(T value)
{
this.value = value;
}
public T Get()
{
lock (this.locker)
{
return this.value;
}
}
public void Set(T value)
{
lock (this.locker)
{
this.value = value;
}
}
}
Et un exemple étant utilisé dans une classe:
private Locked<bool> stopWorkerThread = new Locked<bool>();
public void WorkerThreadEntryPoint()
{
while (true)
{
if (this.stopWorkerThread.Get())
{
break;
}
Aussi, comment pourrais-je tester quelque chose comme ça, de manière automatisée (par exemple créer un test unitaire)?
Enfin, que puis-je faire pour mettre en œuvre un ++ et - opérateur, pour éviter ceci:
this.runningThreads.Set(this.runningThreads.Get() + 1);
Le code exemple ne fonctionnerait pas à moins que le Verrouillé (instance) a été déclarée ailleurs et réutilisé pour tous les appelants - sinon chaque appelant a un verrou différent, ce qui va à l'encontre du but recherché. Et puis il serait plus simple de simplement déclarer un objet et de le verrouiller (obj) –
Eh bien, j'étais en train de laisser les détails d'implémentation de la classe Locked <> en l'air, mais je pense que dans ce cas le verrou serait associé au instance, plutôt que la classe Locked <> - cela rend la classe Locked <> intrusive –