Информация об изменениях

Сообщение Re[25]: Кровавую баню луддитам от 26.04.2017 17:43

Изменено 26.04.2017 17:45 Философ

Re[25]: Кровавую баню луддитам
Здравствуйте, AlexRK, Вы писали:

ARK>Если говорить о предотвращении гонок, то в этом аспекте массивы и структуры ничем не отличаются от скалярных типов. На любую переменную мы держим ровно одну ссылку, которая имеет право изменять эту переменную. Хоть скалярную, хоть массив, хоть структуру. Одна мутабельная ссылка на все потоки. Хочешь изменять "структурку struct A {bool Посчитано; double Рузультат;}" из двух потоков? Фигу! Выбирай один. Или передавай владение этой структуркой из потока в поток (разумеется, копирования при этом не происходит).


Вот это как раз и не понятно, как ты это обеспечишь. Каким образом ты обеспечишь одну ссылку на элемент? Смотри: допустим, у тебя есть массив элементов A*[], который обсчитывается параллельно в несколько потоков, допустим, как-нибудь вот так:
 var parallelResult = Parallel.ForEach(array, a => { a.Посчитано = true; a.Результат = ComputeElelemt(a); });
 DiplayComputingProgress(parallelResult, array);

В этом алгоритме у тебя существует непонятное кол-во потоков обсчёт, о которых ты ничего не знаешь и один поток UI, который отображает последние 10 посчитанных элементов и их сумму. Покажи мне, каким образом ты гарантируешь единственность ссылки на элемент данных, находящийся в array[0].

ARK>Это был просто пример, иллюстрация. Теперь передайте null или NaN в функцию "int Add(int val) { return val + 1; }". Не получается? Значит все-таки в программировании может быть не всё?

ARK>И, раз null/NaN передать в функцию Add невозможно, это означает, что у нас "весь код будет засран проверками" и "в ветке else мы начнём считать погоду в африке"?

Элементарно, Ватсон! NaN — точно такая же абстракция как и NULL. И (-1) или 0 тоже могут быть такими специальными значениями, и многие их регулярно используют, типа (-1 ) — нет значения.
Re[25]: Кровавую баню луддитам
Здравствуйте, AlexRK, Вы писали:

ARK>Если говорить о предотвращении гонок, то в этом аспекте массивы и структуры ничем не отличаются от скалярных типов. На любую переменную мы держим ровно одну ссылку, которая имеет право изменять эту переменную. Хоть скалярную, хоть массив, хоть структуру. Одна мутабельная ссылка на все потоки. Хочешь изменять "структурку struct A {bool Посчитано; double Рузультат;}" из двух потоков? Фигу! Выбирай один. Или передавай владение этой структуркой из потока в поток (разумеется, копирования при этом не происходит).


Вот это как раз и не понятно, как ты это обеспечишь. Каким образом ты обеспечишь одну ссылку на элемент? Смотри: допустим, у тебя есть массив элементов A*[], который обсчитывается параллельно в несколько потоков, допустим, как-нибудь вот так:
 var parallelResult = Parallel.ForEach(array, a => { a.Посчитано = true; a.Результат = ComputeElelemt(a); });
 DiplayComputingProgress(parallelResult, array);

В этом алгоритме у тебя существует непонятное кол-во потоков обсчёта, о которых ты ничего не знаешь и один поток UI, который отображает последние 10 посчитанных элементов и их сумму. Покажи мне, каким образом ты гарантируешь единственность ссылки на элемент данных, находящийся в array[0].

ARK>Это был просто пример, иллюстрация. Теперь передайте null или NaN в функцию "int Add(int val) { return val + 1; }". Не получается? Значит все-таки в программировании может быть не всё?

ARK>И, раз null/NaN передать в функцию Add невозможно, это означает, что у нас "весь код будет засран проверками" и "в ветке else мы начнём считать погоду в африке"?

Элементарно, Ватсон! NaN — точно такая же абстракция как и NULL. И (-1) или 0 тоже могут быть такими специальными значениями, и многие их регулярно используют, типа (-1 ) — нет значения.