Страницы

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

вторник, 31 декабря 2019 г.

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

#c_sharp #потоки_данных #многопоточность


Всем привет, у меня есть список, и я в него с помощью потоков, создаваемых в цикле
записываю значения. Ничего не записывается, я подозреваю, что из-за обращений к элементу
типа 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.
Но могу разобраться, как правильно.
Помогите, пожалуйста.    


Ответы

Ответ 1



Вы не имеете права модифицировать список одновременно из различных потоков. Попробуйте так: 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/ (там есть ссылка на русский перевод, но он, кажется, неполный).

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

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