Список <T>безопасность нескольких потоков писателя - PullRequest
2 голосов
/ 08 июля 2010

Если у меня есть несколько потоков, вызывающих метод Add объекта List, и нет читателей, нужно ли только блокировать объект List перед вызовом Add для обеспечения безопасности потока?

Ответы [ 4 ]

3 голосов
/ 08 июля 2010

Обычно лучше блокировать отдельный (неизменный) объект ... блокировка того же объекта, который вы модифицируете - это плохая практика следует делать с осторожностью .

private readonly object sync = new object();
private List<object> list = new List<object>();

void MultiThreadedMethod(object val)
{
    lock(sync)
    {
        list.Add(val);
    }
}

В базовом случае, подобном этому, у вас не возникнет проблем , но если есть вероятность, что ваш список можно изменить (не содержимое списка, а сам список), то вы может возникнуть ситуация, когда вы блокируете два объекта, когда собираетесь блокировать только один.

1 голос
/ 08 июля 2010

Да.Но вы также можете рассмотреть возможность создания подклассов List и «new» в методе Add.Это позволит вам закрыть замок.Это будет прекрасно работать до тех пор, пока ничего не получит доступ к базовому списку.Этот метод используется для простых древовидных структур в видеоиграх XNA.

1 голос
/ 08 июля 2010
0 голосов
/ 08 июля 2010

Я думаю, что они уже были связаны здесь, но я нашел их очень полезными и интересными:

Потокобезопасные коллекции сложны

Нитейный сборник

...