Множественные вызовы Parallel.ForEach, MemoryBarrier? ⇐ C#
Множественные вызовы Parallel.ForEach, MemoryBarrier?
У меня есть несколько строк данных, и я хочу использовать Parallel.ForEach для вычисления некоторого значения в каждой строке, как показано ниже...
класс DataRow { общественный двойной A {получить; внутренний набор; } общественный двойной B {получить; внутренний набор; } общественный двойной C {получить; внутренний набор; } общедоступная строка данных() { А = двойной.NaN; B = двойной.NaN; C = двойной.NaN; } } классная программа { статическая пустота ParallelForEachToyExample() { вар rnd = новый Random(); вар df = новый список(); для (int я = 0; я { др.Б = 2,0 * др.А; }); // Когда-нибудь нужно? (III) //Thread.MemoryBarrier(); // Параллельно для каждых 2 (IV) Parallel.ForEach(df, dr => { др.С = 2,0 * др.Б; }); } } (В этом примере нет необходимости в распараллеливании, а если бы оно и было, все это могло бы быть внутри одного Parallel.ForEach. Но это упрощенная версия некоторого кода, в котором он делает смысл настроить так).
Возможно ли здесь переупорядочить операции чтения, чтобы получить строку данных, где B != 2A или C != 2B?< /п> Скажем, первый Parallel.ForEach (II) назначает рабочий поток 42 для работы со строкой данных 0. А второй Parallel.ForEach (IV) назначает рабочий поток 43 для работы со строкой данных 0 (как только завершится первый Parallel.ForEach). Есть ли вероятность, что чтение dr.B для строки 0 в потоке 43 вернет double.NaN, поскольку запись из потока 42 еще не произошла? И если да, то поможет ли вообще установка барьера памяти на уровне III? Будет ли это заставлять обновления первого Parallel.ForEach быть видимыми для всех потоков до запуска второго Parallel.ForEach?
У меня есть несколько строк данных, и я хочу использовать Parallel.ForEach для вычисления некоторого значения в каждой строке, как показано ниже...
класс DataRow { общественный двойной A {получить; внутренний набор; } общественный двойной B {получить; внутренний набор; } общественный двойной C {получить; внутренний набор; } общедоступная строка данных() { А = двойной.NaN; B = двойной.NaN; C = двойной.NaN; } } классная программа { статическая пустота ParallelForEachToyExample() { вар rnd = новый Random(); вар df = новый список(); для (int я = 0; я { др.Б = 2,0 * др.А; }); // Когда-нибудь нужно? (III) //Thread.MemoryBarrier(); // Параллельно для каждых 2 (IV) Parallel.ForEach(df, dr => { др.С = 2,0 * др.Б; }); } } (В этом примере нет необходимости в распараллеливании, а если бы оно и было, все это могло бы быть внутри одного Parallel.ForEach. Но это упрощенная версия некоторого кода, в котором он делает смысл настроить так).
Возможно ли здесь переупорядочить операции чтения, чтобы получить строку данных, где B != 2A или C != 2B?< /п> Скажем, первый Parallel.ForEach (II) назначает рабочий поток 42 для работы со строкой данных 0. А второй Parallel.ForEach (IV) назначает рабочий поток 43 для работы со строкой данных 0 (как только завершится первый Parallel.ForEach). Есть ли вероятность, что чтение dr.B для строки 0 в потоке 43 вернет double.NaN, поскольку запись из потока 42 еще не произошла? И если да, то поможет ли вообще установка барьера памяти на уровне III? Будет ли это заставлять обновления первого Parallel.ForEach быть видимыми для всех потоков до запуска второго Parallel.ForEach?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение