Время от времени я сталкиваюсь с этой проблемой и игнорирую ее, но она начала грызть меня сегодня.
private readonly object _syncRoot = new object();
private List<int> NonconcurrentObject { get; } = new List<int>();
public void Fiddle()
{
lock (_syncRoot)
{
// ...some code...
NonconcurrentObject.Add(1);
Iddle();
}
}
public void Twiddle()
{
lock (_syncRoot)
{
// ...some different code...
NonconcurrentObject.Add(2);
Iddle();
}
}
private void Iddle()
{
// NOT THREADSAFE! DO NOT CALL THIS WITHOUT LOCKING ON _syncRoot
// ......lots of code......
NonconcurrentObject.Add(3);
}
У меня есть несколько опубликованных c методов класса с некоторым кодом, который по своей природе не является Безопасный поток (List
выше - тривиальный пример). Я хочу использовать вспомогательные методы для кода, разделяемого между ними (как и любой другой), но при разделении общего кода я сталкиваюсь с дилеммой: использовать ли рекурсивную блокировку в вспомогательных методах или нет? Если я это сделаю, мой код будет расточительным и, возможно, менее производительным. Если я этого не сделаю (как указано выше), вспомогательный метод больше не является потокобезопасным и открыт для неприятных условий гонки, если в будущем его вызовет какой-то другой метод.
Как я могу (элегантно и надежно) сигнализировать, что метод не безопасен для потоков?