Страницы

Поиск по вопросам

четверг, 20 декабря 2018 г.

Доступ потоков к элементу типа List

Всем привет, у меня есть список, и я в него с помощью потоков, создаваемых в цикле записываю значения. Ничего не записывается, я подозреваю, что из-за обращений к элементу типа List. Код: puplic class MyClass(){
List list = new List();
public MyClass(){ FillList(); }
public void FillList(){ for(int i = 0; i < 50; i++) { new System.Threading.Thread(delegate() {Do(i);}).Start();
}
}
void Do(int i){ list.Add(i); } } Упрощенный пример, повторяет мою реализацию. Подозреваю нужно использовать Lock. Но могу разобраться, как правильно. Помогите, пожалуйста.


Ответ

Вы не имеете права модифицировать список одновременно из различных потоков. Попробуйте так: List list = new List(); object mutex = new object();
for (int i = 0; i < 50; i++) new Thread(() => Do(i, mutex)).Start();
void Do(int i, object mutex) { // длинные вычисления lock(mutex) list.Add(i); } С другой стороны, зачем вам такие низкоуровневые конструкции? Есть гораздо более удобные высокоуровневые средства. Вы можете, например, использовать PLINQ: List list = Enumerable.Range(0, 50) .AsParallel() .AsOrdered() // если порядок важен .Select(Compute) .ToList();
int Compute(int i) { // длинные вычисления return i; } Обязательно почитайте: http://www.albahari.com/threading/ (там есть ссылка на русский перевод, но он, кажется, неполный).

Комментариев нет:

Отправить комментарий