Рассмотрим код, который включает в себя запись нескольких потоков в общую структуру данных. Теперь каждый из этих потоков записывает объекты в общий контейнер, которые по сути уникальны. Возьмите следующий (вымышленный) пример:
class Logger
{
IDictionary<string, Log> logDictionary = new Dictionary<string, Log>();
// Method called by several other threads
void AddLog(Log log)
{
logDictionary[log.ID] = log;
}
// Method called by a separate thread
IList GetLog(/*some criteria*/)
{
// loop through logDictionary and
// create an IList based on criteria
}
}
Я ясно понимаю, что одновременный доступ к общему объекту может быть проблемой, если несколько потоков пытаются обновить одну и ту же «переменную» (или слот), что приводит к условиям гонки. Теперь мой вопрос состоит из 3 частей.
(1) Необходима ли синхронизация, если потоки делают слепые обновления? (Даже если они обновляют один и тот же слот / переменную)?
(2) Можно ли предположить, что с учетом того, что каждый поток записывает уникальный объект, нет необходимости синхронизировать доступ к общему словарю / контейнеру?
(3) Действительно ли вызов GetLog () другим потоком создает проблемы, даже если словарь обновляется одновременно другими потоками?