Ho una raccolta personalizzata e voglio aggiungere un wrapper per consentire l'accesso simultaneo.
public class MyConcurrentCollection<T>
{
private MyCollection _collection; // passed in constructor
public void Add(T item)
{
//modifies and may temporarily "break" the collection while executing this method
}
public bool Contains(T item)
{
//only reads
}
// other read and write methods
}
In questo momento, ho object
membro privato che funge da blocco in ogni metodo, consentendo solo un thread alla volta di accedere alla raccolta, quindi ogni metodo ha il seguente aspetto:
public bool Contains(T item)
{
lock(_lock)
{
return _collection.Contains(item);
}
}
Tuttavia questo sembra davvero inefficiente. Poiché Contains()
legge solo dalla raccolta, dovrei consentire più thread in esso?
Ovviamente, ho bisogno di bloccare l'accesso a Add()
e ad altri metodi mentre ci sono thread in Contains()
e ho bisogno di bloccare l'accesso a Contains()
se c'è un thread che desidera modificare la collezione.
C'è qualche svantaggio nel consentire l'uso di più thread in metodi di sola lettura, o dovrei restare con la mia soluzione di base?