|
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
|
|||||||||||
Не как не могу понять код с Task, lock20.12.2020, 20:58. Показов 2862. Ответов 14
Метки нет (Все метки)
Доброго всем времени!
У меня появились затруднение с пониманием кода, а это в в общем то с lock`ом и Task`ом. Я хотел написать программу которая очень и очень много раз записывает в текстовой файл пароли. И я хотел бы делать это с двумя потоками. Решил взять пример кода, тот что я не как не могу понять. Вот он:
И выполняется запись в файл время, и слово. И все это в блоке lock. И весь вот этот метод выполняется в 10 потоков каждое время (Я не до конца понял что значит "Interval = 1", а именно что значит 1, наверное это миллисекунда.). Так вот, вопрос состоится в том, почему потоки работают? Ведь внутри блоке lock, код блокируется и становиться не доступным. Но почему то когда я ставлю 10-50 потоков то запись в файл становиться быстрее. Прошу объяснить мне пожалуйста, потому что в моей программе код реально блокируется. И сначала выполняется 1 цикл, потом второй, и так далее. А мне нужно что бы они выполнялись синхронно хоть и не идеально. Добавлено через 9 минут Вот код моей программы. Она уже на Windows forms.
Но! Создаю так же файл, под названием Password. Запускаю TASK`и, а именно 5 штук. Они запускают метод "GenGenerator", передаю параметры токен и TextWriter w. Ну в этом методе все понятно, только есть такая штука как foreach(var item in gen). В класс gen я передаю сгенерированный пароль. Добавлено через 3 минуты Забыл написать какой результат в моей программе. Вот такой: aaa : 1 baa : 2 caa : 3 aaa : 1 baa : 2 caa : 3 aaa : 1 baa : 2 caa : 3 А я не как не могу понять почему у меня не такой вот результат: aaa : 1 aaa : 1 aaa : 1 baa : 2 baa : 2 baa : 2 caa : 3 caa : 3 caa : 3
0
|
|||||||||||
| 20.12.2020, 20:58 | |
|
Ответы с готовыми решениями:
14
Не могу понять как написать код Не могу понять как работает этот код |
|
|
||||||
| 20.12.2020, 21:39 | ||||||
|
Ня!
Что значит, должны выполняться синхронно? Зачем 2 потока для записи в 1 файл? Быстрее? Почему, ведь файл 1, диск 1?
1
|
||||||
|
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
|
|||
| 21.12.2020, 15:34 [ТС] | |||
|
Rius, здравствуйте!
Спасибо большое конечно за ваше старание. За такой громадный код. Но я что то не понимаю какое действие выполняет программу, на консоль записывает как я понял прокси, но почему то то одинаковые то они изменяются, не много не понял. Можете пожалуйста не расписывать каждую строчку, а просто объяснить что он выполняет и к чему этот пример. Но сами результаты у меня записываются быстро, я думал можно было и быстрее ![]() Либо наверное уже не имеет не какого смысла?
0
|
|||
|
|
|||
| 21.12.2020, 16:24 | |||
|
Два потока пишут в один метод одного объекта.
Тот принимает от разных писателей в очередь и отдельным одним потоком считывает из неё по одному элементу и пишет в один файл. Добавлено через 3 минуты
0
|
|||
|
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
|
||
| 21.12.2020, 16:48 [ТС] | ||
|
Хорошо, спасибо вам, все таки хоть и понял смысл, ну наверное все таки не буду записывать в файл результаты в нескольких потоках.
0
|
||
|
|
||||||
| 21.12.2020, 17:03 | ||||||
Сообщение было отмечено QmlwZ как решение
Решение
А здесь поток записи - один.
Это потоков создания данных 10 штук. Так что используйте. Добавлено через 4 минуты
1
|
||||||
|
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
|
|
| 21.12.2020, 18:40 [ТС] | |
|
Rius, спасибо вам большое еще раз.
Добавлено через 4 минуты Конечно я не очень то и понял уш так сильно код. Все равно есть вопросы, еще есть о том что файл то создается txt, а вот туда не чего не записывается. Да и вот самый главный вопрос, при изменение количество потоков скорость одинаковая. Наверное я просто не вник в код.
0
|
|
|
|
||||||
| 21.12.2020, 18:54 | ||||||
|
Упс, в FileLogger:
Вы скорость можете вычислить? Хотя бы примерно по изменению размера файл в проводнике? Добавлено через 6 минут У меня вышло 93МБ в секунду. Во 2-й раз 164 МБ/с. В общем, много.
1
|
||||||
|
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
|
|
| 21.12.2020, 19:24 [ТС] | |
|
Rius, спасибо сейчас записывается в файл, но вот вопрос, а как вы так проверили скорость загрузки?
Если у меня в папки следить как заполняется файл то он только пролагивается и моментально заполняеться. Наверное вы не о том подумали. Я вот про это :
0
|
|
|
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
|
|||||||
| 21.12.2020, 20:08 [ТС] | |||||||
|
Провел тесты, но на скорую руку. Сразу отмечу, в коде тот что я давал выше, там есть как раз тот код который вы мне подсказывали не давно. Вот она: Перегрузка памяти, приложение лагает при заполнение HeshSet В общем то, ваши тесты показали вот так (все будет в кб): 1. 10.22 сек = 157 132 кб при одном потоке. 2. 10.31 сек = 133 078 кб при 10 потоков. Не знаю почему так, но я записывал пароли, которые перебираются, и вы помогли мне с кодом. С 10 потоков я уже вижу дубликаты, и я знаю как избавиться. Но вот почему то с 10 потоков нет не какого результата и то меньше выдало кб с 10 секунд, ну наверное это уже может зависит от моего компьютера. Теперь с моей программой ту что я писал в самом начале, там то же ваш способ перебор паролей который вы мне подсказали, за это конечно спасибо большое вам. 1. 10.11 сек = 23 210 кб при 5 потоков. 2. 10.32 сек = 34 912 кб при 1 потоке. И это еще не все, такой результат выдавал тогда когда я использовал в коде вот это :
1. 10.62 сек = 221 150 кб при 5 потоков. 2. 10.16 сек = 260 113 кб при 1 потоке. Не знаю почему так. Даже растерян.
0
|
|||||||
|
|
||||||
| 21.12.2020, 20:54 | ||||||
|
С тем генератором не смысла в потоках. Для потоков надо указать диапазоны, которые каждый экземпляр будет генерировать.
1
|
||||||
|
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
|
|||||||||||
| 22.12.2020, 15:15 [ТС] | |||||||||||
|
Rius, Хох!! Вы серьезно профессионал своего дело! Не знаю, мои вопросы, мои проблемы думаю для вас реально как муха, просто взяли и написали...
Мои результаты намного скромнее, ну я думаю это уже зависит от компьютера, а у меня он не самый такой лучший. И еще вот, я щас и буду ковыряться и вникать очень хорошо в код, но пока что не могу особенно понять ошибку если менять количество потоков.
System.ArgumentOutOfRangeException: "Index and count must refer to a location within the buffer." Именно в этой функции:
А если я просто нажму "Продолжить", то все нормально, но если я нажму на Enter, то в место результатах выведется вот это: Кликните здесь для просмотра всего текста
Unhandled exception. System.AggregateException: One or more errors occurred. (Specified argument was out of the range of valid values.) ---> System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. at System.IO.FileStream.WriteSpan(ReadOnlyS pan`1 source) at System.IO.FileStream.Write(Byte[] array, Int32 offset, Int32 count) at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder) at System.IO.StreamWriter.WriteLine(String value) at DunteThread.FileLogger.Write(Message message) in E:\Users\Professional\Desktop\DunteThrea d\DunteThread\Program.cs:line 138 at DunteThread.Program.Generate(TaskData taskData) in E:\Users\Professional\Desktop\DunteThrea d\DunteThread\Program.cs:line 78 at DunteThread.Program.<>c.<Main>b__1_0(Obj ect o) in E:\Users\Professional\Desktop\DunteThrea d\DunteThread\Program.cs:line 45 at System.Threading.Tasks.Task.InnerInvoke( ) at System.Threading.Tasks.Task.<>c.<.cctor> b__274_0(Object obj) at System.Threading.ExecutionContext.RunFro mThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state) --- End of stack trace from previous location where exception was thrown --- at System.Threading.ExecutionContext.RunFro mThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.Tasks.Task.ExecuteWithT hreadLocal(Task& currentTaskSlot, Thread threadPoolThread) --- End of inner exception stack trace --- at System.Threading.Tasks.Task.WaitAllCore( Task[] tasks, Int32 millisecondsTimeout, CancellationToken cancellationToken) at System.Threading.Tasks.Task.WaitAll(Task[] tasks) at DunteThread.Program.Main(String[] args) in E:\Users\Professional\Desktop\DunteThrea d\DunteThread\Program.cs:line 53 E:\Users\Professional\Desktop\DunteThrea d\DunteThread\bin\Debug\netcoreapp3.1\Du nteThread.exe (процесс 9432) завершил работу с кодом 0. Чтобы автоматически закрывать консоль при остановке отладки, включите параметр "Сервис" ->"Параметры" ->"Отладка" -> "Автоматически закрыть консоль при остановке отладки". Нажмите любую клавишу, чтобы закрыть это окно… Длины пароля 5, количество символов 72.
0
|
|||||||||||
|
|
|||||||
| 22.12.2020, 18:29 | |||||||
Сообщение было отмечено QmlwZ как решение
РешениеДля многопоточности надо переделывать генератор, чтобы в каждом потоке он работал в отдельном диапазоне. Нет смысла одни и те же строки дважды писать. Вот так чуть быстрее будет
1
|
|||||||
|
2 / 2 / 0
Регистрация: 10.08.2020
Сообщений: 169
|
||
| 22.12.2020, 21:23 [ТС] | ||
|
Rius, хорошо, спасибо!!!!
Буду пользоваться вашим методом, после изучение кода. Вы мне сильно помогли! Вот ваш опыт просто на глаза, другими словами вы крутой! Добавлено через 1 минуту Не раз вы меня выручаете.
0
|
||
| 22.12.2020, 21:23 | |
|
Помогаю со студенческими работами здесь
15
Не могу понять как организовать асинхронный код Сайт на Ucoze, не могу понять как добавить код Не могу понять как работает этот код в деталях Не могу понять, как перевести код в WPF формат
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|