2013-08-19 3 views
0

Для одновременной словарюОдновременные Словари в C#

ConcurrentDictionary<string, C> dic; 

(где C некоторый класс), кто-нибудь знает ссылки на правила и ограничения для того, как следует выполнять операции на примере C, скажем, C0, то есть значение в словаре? То есть, если у нас есть один поток, выполняющий операции на C0 напрямую, а еще два потока, выполняющие операции на C0 через словарь, я бы предположил, что мы все еще потенциально можем столкнуться с условиями гонки? (Мы бы не хотели, чтобы C был примитивным).

Спасибо за любые указатели, которые вы можете предложить!

Best, Chris

+0

использовать примитивы синхронизации, такие как 'lock' в классе' C'. – I4V

+0

@SLaks Но это не поможет ... – I4V

+0

'Мы не хотели бы, чтобы C был примитивным, что не очень верно. – SLaks

ответ

2

ConcurrentDictionary сам класс потокобезопасно.

Это не имеет ничего общего с потокобезопасностью того, что вы вкладываете в словарь.

Вы должны убедиться, что ваши классы являются потокобезопасными или, в идеале, неизменяемыми.

Если вы изменяете объекты в словаре, вы также должны знать, что другой поток может удалить или заменить его в любое время.

Короче говоря, безопасность потока по-прежнему сложна; вам все равно нужно точно знать, что может измениться, и убедитесь, что каждый поток может справиться с этим.

Дополнительную информацию о написании объектов, защищенных потоком, см. my blog.

+0

Привет, спасибо за ответ и подтверждение того, что проблема связана с безопасностью элементов словаря. Но так как это так, не является ли I4V в письменной форме «использовать примитивы синхронизации, такие как блокировка в C»? –

+0

Кроме того, причина, по которой я сказал: «Мы бы не хотели, чтобы C был примитивным», потому что тогда C не имеет ссылок, не обращаясь к нему напрямую, хотя словарь (и, следовательно, обязательно потокобезопасен, потому что словарь). Это неправильно? - Спасибо –

+0

@ChrisW: Да, но это все еще ограничивает цель параллелизма. – SLaks

 Смежные вопросы

  • Нет связанных вопросов^_^