 |
Вложенные циклы - Вопросы и ответы, обсуждения - Ваши вопросы по C# только в данном разделе |
26.12.2011, 07:22
|
#1
|
|
|
|
Сержант
|
 Регистрация: 01.10.2011
 Сообщений: 128
 Популярность: 5723
 Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
|
Вложенные циклы
Помогите пожалуйста, кто сталкивался с вложенными циклами в нескольких потоках?
У меня есть цикл:
Код:
while (!loginReader.EndOfStream)
{
username = loginReader.ReadLine();
while (!passwordReader.EndOfStream)
{
lock (locker)
{
pass = passwordReader.ReadLine();
}
log.loginer(username, pass);
main.linesInFile = main.linesInFile + 1;
}
}
который читает строку из первого файла, а потом перебирает все строки во втором. Так вот беда, в один поток это работает на ура, а когда делаю 5-10-15 в общем дофига потоков то цикл накрывается медным тазом, потому что каждый поток пытается взять из первого файла по строке.
Как сделать, что бы из первого файла строка бралась только один раз за цикл, а не умножалась на количество потоков?
ЗЫ Единственное решение которое пришло в голову это добавить ручками N пустых строк в второй фаил и N строк перед каждой строкой в первом О_о
ЗЗЫ И еще один не менее важный вопрос, как выйти из внутреннего цикла если фаил закончился?
Код:
while (!loginReader.EndOfStream)
{
username = loginReader.ReadLine();
while (!passwordReader.EndOfStream)
{
lock (locker)
{
pass = passwordReader.ReadLine();
}
log.loginer(username, pass);
main.linesInFile = main.linesInFile + 1;
if (passwordReader.EndOfStream)
{
passwordReader.DiscardBufferedData();
break;
}
}
}
Такой вариант не помогает
Добавлено через 1 час 39 минут
последний вопрос отменяется, какие то в другом месте...найти бы в каком 
На счет многопоточности еще в силе
Добавлено через 2 часа 4 минуты
Нашел где косяк, кто объяснит, почему вложенный цикл не запускается повторно?
ЗЫ Я конечно догадываюсь, потому, что он закончился, но тогда как сбросить его на исходную позицию?
Добавлено через 2 часа 46 минут
Последнюю проблему решил иницализировав стримридер повторно
Код:
if (passwordReader.EndOfStream)
{
passwordReader = new StreamReader(BruteForm.dicBox1);
break;
}
________________
Talk is cheap. Show me the code
— Linus Torvalds
Последний раз редактировалось Yukikaze; 26.12.2011 в 10:08.
Причина: Добавлено сообщение
|
|
|
26.12.2011, 16:04
|
#2
|
|
|
|
Старший сержант
|
 Регистрация: 29.07.2011
 Сообщений: 197
 Популярность: 8989
 Сказал(а) спасибо: 45
Поблагодарили 175 раз(а) в 139 сообщениях
|
Re: Вложенные циклы
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
Помогите пожалуйста, кто сталкивался с вложенными циклами в нескольких потоках?
который читает строку из первого файла, а потом перебирает все строки во втором. Так вот беда, в один поток это работает на ура, а когда делаю 5-10-15 в общем дофига потоков то цикл накрывается медным тазом, потому что каждый поток пытается взять из первого файла по строке.
Как сделать, что бы из первого файла строка бралась только один раз за цикл, а не умножалась на количество потоков?
|
|
 |
|
 |
|
Считать файл в стек и брать данные для потока из него.
Вообще рекомендую наплодить для каждого потока по 1 стеку, в котором сберегается содержание 2го файла, а не считывать его каждый раз. И потоки не будут ждать окончания блокировки от другого потока.
Пускай главный хранит все строки 1го файла, и для каждой строчки создает поток параметром куда идут: ( string <Строка из 1го файла>, Queue <Стек со строками из 2го файла>).
Или сделай еще хитрее:
1й и 2й файл в массивы. дальше работай с ними как для 1го потока в цикле Parallel.For(). // хотя тут не гарантирую, надо проверить, когда писал брутфорсер наткнулся на то что при сравнивании строк оно не всегда выдавало правильный ответ...
|
|
|
Пользователь сказал cпасибо:
|
|
27.12.2011, 05:40
|
#3
|
|
|
|
Сержант
|
 Регистрация: 01.10.2011
 Сообщений: 128
 Популярность: 5723
 Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
|
Re: Вложенные циклы
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
Считать файл в стек и брать данные для потока из него.
Вообще рекомендую наплодить для каждого потока по 1 стеку, в котором сберегается содержание 2го файла, а не считывать его каждый раз. И потоки не будут ждать окончания блокировки от другого потока.
Пускай главный хранит все строки 1го файла, и для каждой строчки создает поток параметром куда идут: ( string <Строка из 1го файла>, Queue <Стек со строками из 2го файла>).
Или сделай еще хитрее:
1й и 2й файл в массивы. дальше работай с ними как для 1го потока в цикле Parallel.For(). // хотя тут не гарантирую, надо проверить, когда писал брутфорсер наткнулся на то что при сравнивании строк оно не всегда выдавало правильный ответ...
|
|
 |
|
 |
|
Спасибо, покурил мануалы по Parallel.Foreach(), занятная вещица оказалась.
Код:
Parallel.ForEach(Global.globalUser,
username =>
{
Parallel.ForEach(Global.globalUser,
pass =>
{
log.loginer(username, pass);
Global.linesInFile = Global.linesInFile + 1;
}
);
}
);
Такой цикл выдает 70ппс в один поток, правда при запуске в несколько потоков оно просто дублирует результат, но по сути как я понял оно само на потоки делит
Добавлено через 1 час 49 минут
хм...постепенно скорость увеличивается, сначала примерно 10-15 ппс, потом быстро растет до 70 и потихоньку прорывается до рекордных 80. Все это конечно неплохо, если бы не одно "НО", как выйти из внутреннего цикла при определенных условиях?
Добавлено через 3 часа 0 минут
Как выйти из внутреннего цикла я разобрался, просто добавил условие с ParallelLoopState.Break()
И сразу новый вопрос, КАК убить эти 2 цикла? Пытался убить процесс в котором они были запущены, но они все равно продолжают жить своей жизнью, да и loopState как то не помогает.
________________
Talk is cheap. Show me the code
— Linus Torvalds
Последний раз редактировалось Yukikaze; 27.12.2011 в 08:40.
Причина: Добавлено сообщение
|
|
|
28.12.2011, 02:21
|
#4
|
|
|
|
Старший сержант
|
 Регистрация: 29.07.2011
 Сообщений: 197
 Популярность: 8989
 Сказал(а) спасибо: 45
Поблагодарили 175 раз(а) в 139 сообщениях
|
Re: Вложенные циклы
Вынести в отдельную функцию этот цикл и внутри цикла сделать return ?
|
|
|
28.12.2011, 23:49
|
#5
|
|
|
|
Сержант
|
 Регистрация: 01.10.2011
 Сообщений: 128
 Популярность: 5723
 Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
|
Re: Вложенные циклы
________________
Talk is cheap. Show me the code
— Linus Torvalds
|
|
|
14.01.2012, 10:46
|
#6
|
|
|
|
Разведчик
|
 Регистрация: 07.01.2012
 Сообщений: 5
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Вложенные циклы
действительно старенький
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
[Помогите!] VB. Циклы!
|
Moisei |
Вопросы и ответы, обсуждения |
1 |
24.09.2010 23:44 |
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 17:17.
|
 |