В многопоточной программе, запущенной на машине с несколькими процессорами, мне нужно получить доступ к общему состоянию (_data в приведенном ниже примере кода) с использованием изменчивых операций чтения/записи для обеспечения правильности.Использование летучих (Thread.VolatileRead/Thread.VolatileWrite) в C#
Другими словами, можно ли кучи объектов кэшировать на процессоре?
Используя приведенный ниже пример и предполагая, что многопоточность будет обращаться к методам GetValue и Add, мне нужно, чтобы ThreadA мог добавлять данные (используя метод добавления) и ThreadB, чтобы иметь возможность сразу видеть/получать эти добавленные данные (используя метод GetValue). Так что мне нужно добавить волатильные чтения/записи в _data, чтобы это обеспечить? В основном я не хочу добавлять данные для кэширования на процессор ThreadA.
/Я не блокирую (соблюдая эксклюзивный доступ к потоку), так как код должен быть очень быстрым, и я не удаляю никаких данных из _data, поэтому мне не нужно блокировать _data.
Спасибо.
**** Обновление ****************************
Очевидно, вы, ребята, думаете, происходит блокировка свободного использования этот пример - плохая идея. Но какие побочные эффекты или исключения я могу увидеть здесь?
Может ли тип словаря генерировать исключение, если 1 поток выполняет итерацию значений для чтения, а другой поток выполняет итерацию значений для обновления? Или я просто испытаю «грязные чтения» (что было бы хорошо в моем случае)?
**** End Update ****************************
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();
}
}
Спасибо за ответы. Что касается замков, методы довольно часто вызываются многомиллионными потоками, поэтому моя проблема связана с оспариваемыми блокировками, а не с фактической операцией блокировки.
Итак, мой вопрос о кешировании cpu, может ли куча объектов (поле экземпляра _data) кэшироваться на процессоре? Нужен ли мне доступ к полю _data с помощью изменчивых операций чтения/записи?
/Кроме того, я застрял с .Net 2.0.
Благодарим за помощь.