|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
||||||
Как правильно поступить для потокобезопасности17.02.2024, 07:19. Показов 3793. Ответов 62
Метки нет (Все метки)
Здравствуйте,
Есть код, обрабатывающий побайтно файл, заранее загруженный в byte[]. Потоки организуются средствами C# через Parallel.ForEach вот таким образом:
if выполнится, в другом потоке max изменится и когда будет исполняться Exchange, то оно по сути испортит данные? Логичнее ли сделать через lock весь if?Вопрос 2 - как правильно покидать Parallel.ForEach внутри кода, если там не получается использовать break? Я сейчас просто делаю метку к концу и прыгаю туда goto.
0
|
||||||
| 17.02.2024, 07:19 | |
|
Ответы с готовыми решениями:
62
Как правильно поступить? Как правильно поступить как правильно поступить? |
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|
| 19.02.2024, 09:57 [ТС] | |
|
0
|
|
|
|
|
| 19.02.2024, 10:01 | |
|
Не хотите слушать -, как сказал Usaga, - пишите как умеете.
А то, что у вас потом не работает, это следствие того, что вы пишите как умеете, а не как правильно. Мне вас уже лень переубеждать. У вас не работает? Это ваши проблемы, не мои.
0
|
|
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
||
| 19.02.2024, 10:18 [ТС] | ||
|
0
|
||
|
|
|||
| 19.02.2024, 10:41 | |||
|
Не по теме:
Я вначале решил что на MSDN действительно как-то невнятно написано, но нет: кто-то читает по диагонали. Рекомендации
0
|
|||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
||||
| 19.02.2024, 12:20 [ТС] | ||||
|
в целом не ясно зачем для lock сделали указание объекта если это формальность, но это вне рамок обсуждения и мне не слишком интересно. Далее, вынес object lockObject = new object(); за рамки лмбда-функции, но ему такое не нравится.
0
|
||||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
||||||
| 19.02.2024, 18:46 [ТС] | ||||||
В любом случае по скорости полный провал, в 4.5 раза медленнее чем последовательный код, но потребление ОЗУ 137 мегабайт, непонятно зачем столько ОЗУ. Ладно, для меня тема исчерпана.
0
|
||||||
|
|
||
| 19.02.2024, 19:09 | ||
|
Надеюсь теперь поймёте что ThreadLocal как раз тут и нужен. Ах да... я забыл - "это не поиск максимального значения". Мы пытаемся сделать что-то о чём не знаем. Но упорно пытаемся что-то советовать, насаждая своё понимание нормального программирования.
0
|
||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|||||||||||
| 19.02.2024, 20:28 [ТС] | |||||||||||
|
Из примера я правда не понял как им пользоваться и как отдавать данные из лямбды в основную программу.
Задавая вопрос - я хочу получить ответ, а не лекцию о правильном программировании чего-то придуманного вами или нотацию на тему моего нежелания "становиться лучшим в мире программистом". Учите своих жён и детей, а я сам как-то разберусь - учиться мне или нет.
0
|
|||||||||||
|
|
|||||
| 20.02.2024, 00:59 | |||||
|
Тут согласен. Форум добровольный, хочу читаю, хочу пишу. А вы в свою очередь, можете вообще ничего не писать.
4
|
|||||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
||||||||
| 20.02.2024, 08:17 [ТС] | ||||||||
|
Итак, возвращаясь к вопросу:
ThreadLocal не подойдёт, так как это породит необходимость повторного поиска, который тоже нужно будет распараллеливать, что опять породит ThreadLocal и т.д. Lock сильно тормозит работу кода и жрёт оперативку как не в себя. Попробую разобраться с реализацией через CompareExchange, так как Exchange работает хорошо, но if остаётся в подвешенном состоянии.
0
|
||||||||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|
| 25.02.2024, 07:14 [ТС] | |
|
Такой вопрос - можно ли потокам иметь уникальный номер не связанный с другим потоком, но чтобы он оставался фиксированным на протяжении всего хода выполнения?
Потоки привязаны к ядрам и было бы логично имея номер потока 1 после его окончания работы снова запустить другой поток тоже с номером 1, не пересекаясь. Тогда можно было бы результаты записывать в массив размерности числа ядер а окончательную проверку делать после закрытия всех потоков, даже для 128 ядер это всего 128 элементов массива.
0
|
|
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
|
|
| 25.02.2024, 09:13 | |
|
0
|
|
|
|
||
| 25.02.2024, 10:21 | ||
|
belalugoci, Самое частое решение: дробим все данные на блоки/батчи/группы/подмассивы, и скармливаем эти части отдельным потокам. Результат агрегируем и по заверешнию всех вычислений -- выводим результат из короткого массива. Прирост от многопоточности будет начиная с 1кк значений (и то не факт). Меньше запихивать в многопоток нет смысла. Пока вы будете озвучивать код и задачу кусками, вам будут накидывать фиг-пойми каких решений. "Универсальное" решение описал выше, но в зависимости от вашей задачи -- может быть куча ньюансов "как лучше". Опишите входной массив и что с ним нужно сделать. Можно словами, код потом подскажут.
0
|
||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
||||||
| 25.02.2024, 10:33 [ТС] | ||||||
|
Добавлено через 5 минут
0
|
||||||
|
|
|||||||
| 25.02.2024, 12:04 | |||||||
0
|
|||||||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
||||||
| 25.02.2024, 15:03 [ТС] | ||||||
|
Wolfdp, очень медленно и будет кушать оперативку, идею я понял без примера, возможно смогу прикрутить к своему коду, спасибо. Во всяком случае Parallel.ForEach тут точно не подходит.
Не ясно только зачем ему столько ОЗУ, еще бы это компенсировалось скоростью - можно было бы понять.
0
|
||||||
|
Модератор
|
|||||
| 25.02.2024, 21:22 | |||||
|
Что за код вы тестируете? Если вот этот: Вернее выдаёт результат, что lock - это не бесплатная операция, что и так очевидно. Если вот этот: // много всего тут исполняется, трат на создание запуск отдельных задач, и трат на локировку для аккумуляцию результата.Так как у нас нет понимания что за код // много всего тут исполняется, то для нас результат вашего теста тоже полная бесмыслица.А если взять задачу в целом:
0
|
|||||
|
|
|
| 25.02.2024, 22:28 | |
|
belalugoci, на какой длине строки вы проверяли?
Добавлено через 5 минут А, ещё такой момент -- batch задавили часом не тоже по 5? Выше забыл упомянуть, но нужно чтобы одна группа была большой, т.к. создание/старт каждой группы отъедает время.
0
|
|
| 25.02.2024, 22:28 | |
|
Подскажите как правильно поступить как правильно поступить с COOKIE как правильно поступить с hover Отображение левого меню, как правильно поступить? Как правильно нужно поступить в текущей ситуации? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Жара жесть.
kumehtar 18.08.2026
Пролетают летом дни
Тридцать пять жары в тени.
Каждый август год от года
Дарит жаркую погоду.
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|