В многопоточной программе, работающей на компьютере с несколькими процессорами, мне нужен доступ к общему состоянию (_data в приведенном ниже примере кода) с использованием энергозависимого чтения / записи, чтобы обеспечить правильность.
Другими словами, могут ли объекты кучи кэшироваться на процессоре?
Используя приведенный ниже пример и предполагая, что многопоточность будет обращаться к методам GetValue и Add, мне нужно, чтобы ThreadA мог добавить данные (используя метод Add), а ThreadB мог сразу же увидеть / получить эти добавленные данные (используя метод GetValue). Так что мне нужно добавить изменчивое чтение / запись в _data, чтобы обеспечить это? По сути, я не хочу добавлять данные для кэширования на процессоре ThreadA.
/ Я не блокирую (навязываю монопольный доступ к потокам), так как код должен быть очень быстрым, и я не удаляю никакие данные из _data, поэтому мне не нужно блокировать _data.
Спасибо.
**** Обновление ****************************
Очевидно, что вы, ребята, думаете, что использование блокировки без использования этого примера - плохая идея. Но с какими побочными эффектами или исключениями я могу столкнуться здесь?
Может ли тип Dictionary генерировать исключение, если один поток повторяет значения для чтения, а другой поток повторяет значения для обновления? Или я бы просто испытал «грязное чтение» (что было бы хорошо в моем случае)?
**** Завершить обновление ****************************
public sealed class Data
{
private volatile readonly Dictionary<string, double> _data = new Dictionary<string, double>();
public double GetVaule(string key)
{
double value;
if (!_data.TryGetValue(key, out value))
{
throw new ArgumentException(string.Format("Key {0} does not exist.", key));
}
return value;
}
public void Add(string key, double value)
{
_data.Add(key, value);
}
public void Clear()
{
_data.Clear();
}
}
Спасибо за ответы. Что касается блокировок, методы почти постоянно вызываются несколькими потоками, поэтому моя проблема в оспариваемых блокировках, а не в действительной операции блокировки.
Итак, мой вопрос о кэшировании процессора, могут ли объекты кучи (поле экземпляра _data) кэшироваться на процессоре? Нужен ли мне доступ к полю _data с использованием volatile чтения / записи?
/ Также я застрял с .Net 2.0.
Спасибо за вашу помощь.