Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676

Как правильно поступить для потокобезопасности

17.02.2024, 07:19. Показов 3907. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,

Есть код, обрабатывающий побайтно файл, заранее загруженный в byte[]. Потоки организуются средствами C# через Parallel.ForEach вот таким образом:
C#
1
2
3
4
5
6
7
8
9
Parallel.ForEach(num, ii =>
{
    // много всего тут исполняется
 
    if (max < (end - start))
    {
        Interlocked.Exchange(ref max, end - start);
    }
});
Вопрос 1 - как я понимаю может возникнуть ситуация когда условие if выполнится, в другом потоке max изменится и когда будет исполняться Exchange, то оно по сути испортит данные? Логичнее ли сделать через lock весь if?

Вопрос 2 - как правильно покидать Parallel.ForEach внутри кода, если там не получается использовать break? Я сейчас просто делаю метку к концу и прыгаю туда goto.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.02.2024, 07:19
Ответы с готовыми решениями:

Как правильно поступить?
Если я пишу код в обработчике события, в котором происходит инициация следующего обработчика события, то эта цепочка может выполнятся...

Как правильно поступить
Есть два запроса. За пример возьму: russian photography russian photographer Протупил и заказал текст под эти два запроса....

как правильно поступить?
ребята, подскажите, как правильно поступить... наряду с остальными была проиндексирована определенная страница сайта со текстом о...

62
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
26.02.2024, 15:52  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kotelok Посмотреть сообщение
В пункте 6 время загрузки данных из файла в память может быть и как в п.2, и в десятки-сотни раз быстрее.
может, но оно не будет колебаться на порядки в измеряемом интервале, то есть оно будет константным. Учитывать временные флуктуации из-за нагрузки на ОС и диск со стороны других программ не вижу смысла, так как при повторяемости теста значение будет стремиться к определенной константе, а резкие изменения будут отброшены.

Цитата Сообщение от kotelok Посмотреть сообщение
И если это не учитывать при исследовании скорости алгоритмов, обрабатывающих большие объёмы данных (т.е. не производить предварительную полную загрузку файла/частей в память или не исключать это время из отчётов), то результаты могут сильно разниться даже между двумя запусками одного и того же алгоритма в полностью идентичных условиях.
оно и учитывается, я ранее написал что тест работает с ОЗУ.

Добавлено через 14 минут
Цитата Сообщение от Wolfdp Посмотреть сообщение
Чекнул для 50_000_000 слов длиной от 10 до 30 -- однопоточный отрабатывает за 00:00:00.0000162
Core i5-2400 обрабатывает 4.5 млн слов за ~2 секунды
я не знаю как конкретно и что измеряете вы, но ваш код, переделанный на индексы стал работать сильно быстрее, но всё еще медленнее моего однопотока в 3 раза, всё на тех же 4.5 млн слов, при этом Benchmark показывает среднее значение для вашего кода 537 мс, это 0.5 сек, а никак не 0.0162 мс, еще и на данных на порядок больше. Даже если у вас современный ЦПУ по сравнению с моим старичком, то всё равно он не будет у вас быстрее в 31 раз.

Разница в 15 раз для топового ЦПУ который никто особо не покупает чтобы тестировать текстовики дома.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
26.02.2024, 16:18
Цитата Сообщение от belalugoci Посмотреть сообщение
я не знаю как конкретно и что измеряете вы
Изначально непрвильно сохранял время остановки.
C#
1
Console.WriteLine($"{sw.Elapsed} = {result}");
В Debug отрабатывает за 4sec. Многопоток -- 1

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System.Diagnostics;
using System.Text;
 
string source = InitSource();
int batch = source.Length;
 
var sw = Stopwatch.StartNew();
var maxWord = Max(0);
var time = sw.Elapsed;
Console.WriteLine($"{time} = {maxWord}");
 
 
sw.Restart();
batch = source.Length / 4;
var tasks = new List<Task<string>>();
for (var i = 0; i < source.Length; i += batch)
{
    var start = i;
    tasks.Add(Task.Run(() => Max(start)));
}
 
maxWord = tasks.Select(t => t.Result).OrderByDescending(x => x.Length).First();
time = sw.Elapsed;
Console.WriteLine($"{time} = {maxWord}");
 
string Max(int start)
{
    var n = start + batch;
    var max = 0;
    var maxIndex = 0;
    var currentIndex = 0;
    var current = 0;
    char ch;
    for (var i = start; i < n; i++)
    {
        current = 0;
        currentIndex = i;
        while (i < source.Length && (ch = source[i++]) != ' ')
            current++;
        if (max < current)
        { 
            max = current;
            maxIndex = currentIndex;
        }
    }
 
    return source.Substring(maxIndex, max);
}
 
string InitSource()
{
    var arr = "qwertyuiopasdfghjklzxcvbnm";
    var maxWord = "Pneumonoultramicroscopicsilicovolcanoconiosis";
    var builder = new StringBuilder(1_500_000_000);
    var random = new Random();
    for (var i = 0; i < 50_000_000; i++)
    {
        var n = random.Next(10, 30);
        for (var j = 0; j < n; j++)
            builder.Append(arr[random.Next(arr.Length)]);
        builder.Append(" ");
    }
    builder.Append(maxWord);
    return builder.ToString();
}
Можете скинуть сюда свой вариант, думаю его можно спокойно будет закинуть в таски. Ну либо понять что вы конкретно делаете, потому как вполне возможно что выделаете действие А, я несколько другое, отсюда и разница в выполнении.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
26.02.2024, 16:43
Хз, класс прям предназначен для точных замер времени итерации. Другое дело что я под DEBUG все запускаю и фоном виртуалка и ютуб в браузере шарашат. В любом случае тут замеры явно идут на секунды, так что для очень больших блоков -- есть профит. Искать минимальный размер этого блока -- без меня. Могу глянуть вашу реализацию и переделать на Task или другой вариант многопотока, но не более.

p.s. таки есть мини ошибка (на замеры не влияет)
C#
1
2
3
4
5
        while (i < source.Length && (ch = source[i]) != ' ')
{
    i++;
    current++;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.02.2024, 16:43

Подскажите как правильно поступить
Доброго всем времени суток. Решил я обновить немного комп, но очень ограничен в средствах, потому видеокарты пока не будет, но в ближайший...

как правильно поступить с COOKIE
Привет всем делаю рефиральную систему. Хочу сделать что бы добавив к любому адресу сайта get параметр в куки записывался id реферала. у...

как правильно поступить с hover
Привет всем. сейчас делаю меню и у меня возник вопросик. у меня вертикальное выпадающее меню на чистом css. Так вот у каждого пункта есть...

Отображение левого меню, как правильно поступить?
На сайте есть левое меню и есть контент. В данный момент подменю выпадающее. Надо сделать так, чтобы оно было справа от основного меню....

Как правильно нужно поступить в текущей ситуации?
Добрый день. Есть задача сделать &quot;журнал&quot; в excel с группами который выглядел бы как на диаграмме 1. Соответственно я захотел хоть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
63
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru