Я ищу решение, которое позволяет нескольким потокам читать общий ресурс (разрешено параллелизм), но затем блокирует эти потоки чтения после того, как поток входит в мутирующий блок, чтобы достичь наилучшего из обоих мировых ,Параллельность с чтением, но блокировка с мутированием
Я искал это reference, но, похоже, решение состоит в том, чтобы блокировать чтение и запись потоков.
class Foo {
List<string> sharedResource;
public void reading() // multiple reading threads allowed, concurrency ok, lock this only if a thread enters the mutating block below.
{
}
public void mutating() // this should lock any threads entering this block as well as lock the reading threads above
{
lock(this)
{
}
}
}
Есть ли такое решение в C#?
Редактировать
Все потоки, входящие в обоих GetMultiton
и конструктор должен возвращать тот же экземпляр. хотите, чтобы они были потокобезопасными.
class Foo: IFoo {
public static IFoo GetMultiton(string key, Func<IFoo> fooRef)
{
if (instances.TryGetValue(key, out IFoo obj))
{
return obj;
}
return fooRef();
}
public Foo(string key) {
instances.Add(key, this);
}
}
protected static readonly IDictionary<string, IFoo> instances = new ConcurrentDictionary<string, IFoo>();
Использование
Foo.GetMultiton("key1",() => new Foo("key1"));
Благодаря Скотт для проникновения в суть, я задаюсь вопросом, что 'ConcurrentDictionary' о, скажем, мой sharedResource является' ConcurrentDictionary', должен ли я использовать 'ReadWriteLockSlim' –
Оцените, можете ли вы добавить пример к своему ответу, если sharedResource является' ConcurrentDictionary' –
Если у вас есть параллельный словарь, вы избавитесь от всех блокировок и просто используйте сам словарь. Он уже обрабатывает блокировку для вас. –