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