Я пытаюсь понять преимущества параллельной библиотеки задач, используя традиционную многопоточность, и когда я думаю о ситуации ниже, я застрял, думая, что она обрабатывает состояние гонки или делает это нужно обрабатывать это в нашем коде?Является ли задача о параллельной библиотеке задач (TPL)
Вот мой код:
int depdt = 0;
Parallel.For(1, 10, mem =>
{
for (int dep = 1; dep <= 10; dep++)
{
depdt = dep;
Console.WriteLine("MEMBER: " + mem + " " + "Dependent: " + dep);
}
Console.WriteLine("Dep Value: " + depdt + " " + "mem: " + mem);
});
Console.ReadKey();
Я побежал его пару раз, и я не вижу какой-либо поток мешая/перезапись на «depdt» переменной. Но мне нужно это подтвердить. (Или) Для того, чтобы сделать его поточно я должен вручную создать экземпляр класса и реализовать его как код ниже, чтобы избежать условий гонки
int depdt = 0;
Parallel.For(1, 10, mem =>
{
Worker worker = new Worker();
worker.DoWork(mem);
});
Console.ReadKey();
public class Worker
{
public void DoWork(int mem)
{
int depdt = 0;
for (int dep = 1; dep <= 10; dep++)
{
depdt = dep;
Console.WriteLine("MEMBER: " + mem + " " + "Dependent: " + dep);
}
Console.WriteLine("Dep Value: " + depdt +" "+ "mem: "+ mem);
}
}
ответ на @yms: Я имею в виду при использовании нормальных потоков выполнения depdt становится Название переменной ненадежный. Вот мой код:
for (int mem = 1; mem <= 10; mem++)
{
var t= new Thread(state =>
{
for (int dep = 1; dep <= 10; dep++)
{
depdt = dep;
Console.WriteLine("MEMBER: " + mem + " " + "Dependent: " + dep);
}
Console.WriteLine("Dep Value: " + depdt + " " + "mem: " + mem);
});
t.Start(string.Format("Thread{0}", mem));
}
Console.ReadKey();
Вот мой вывод на экран: Infact как MEM и DEP переменные становятся ненадежными
Обратите внимание, что переменная присвоения 4 байта Int [обычно атомарных] (http://stackoverflow.com/questions/8290768/is-assignment-operator-atomic). Также я не вижу необходимости вводить новый класс, вы могли бы просто использовать локальную переменную в выражении лямбда – yms
@yms. Я имею в виду, используя обычную Threading, вы обычно попадаете в такое состояние, где переменная «depdt» становится ненадежной. См. Мой ниже код и его результат с Threads – marak
@yms Я добавил дополнительную информацию в вопрос, отвечая на ваш комментарий. Спасибо – marak