Я хочу создать пример, показывающий сбой при использовании параллельных циклов. Я пытаюсь составить пример, который показывает в Prallel. Для двух потоков могут изменяться общие (нелокальные) переменные. Для этого я пишу следующий пример, в котором поток присваивает свой номер переменной, а затем мы добавляем задержку, чтобы увидеть, переопределит ли какой-либо другой поток эту переменную или нет. На выходе это переопределение никогда не происходит со мной.
Parallel.For(0, result.Length, ii =>
{
int threadNum = Thread.CurrentThread.ManagedThreadId;
Thread.Sleep(10000);
if (threadNum != Thread.CurrentThread.ManagedThreadId)
Console.WriteLine("threadNum = {0}, Thread.CurrentThread.ManagedThreadId = {1}", threadNum, Thread.CurrentThread.ManagedThreadId);
});
Можно возразить, что я задерживаю все темы. Поэтому я добавляю задержку только к одному потоку:
int num = -1;
Parallel.For(0, result.Length, ii =>
{
if( num == -1)
num = Thread.CurrentThread.ManagedThreadId;
int threadNum = Thread.CurrentThread.ManagedThreadId;
if (Thread.CurrentThread.ManagedThreadId == num)
{
Console.WriteLine("num = {0}", num);
Thread.Sleep(10);
}
if (threadNum != Thread.CurrentThread.ManagedThreadId)
Console.WriteLine("threadNum = {0}, Thread.CurrentThread.ManagedThreadId = {1}", threadNum, Thread.CurrentThread.ManagedThreadId);
});
Здесь он просто запоминает первый поток и только задерживает его. Тем не менее я не наблюдаю никакого переопределения переменной 'threadNum' потоками.
Любые идеи?