Синхронизация потоков

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by arthurfok, 14 Nov 2012.

  1. arthurfok

    arthurfok New Member

    Joined:
    3 Jul 2011
    Messages:
    23
    Likes Received:
    0
    Reputations:
    0
    Допустим , мы написали программу, который многопоточно брутит пароли (подбирает).

    Пример функции потока:
    Code:
    //Код C#
    void TryPasswords(string[] pass,int startIndex,int lenght)  
    {
             for(int i= startIndex;i<startIndex+lenght;i++)
             {
                  // if(TryPassword(pass[i])) 
                  //    WriteToFile(pass[i]);
             }
    }
    // думаю вам понятно для чего параметры функии. 
    Вопрос, если синхронизировать эти потоки ( что бы 2 и более потоки не питались писать good пароли в файл, что бы избежать от File Exception) , то не замедлится ли скорость PPS (пароль/сек) ??
    Спасибо за ответ

    --------------------------------------------------

    И если замедлится , то тогда в чем смысл многопоточного брута?
     
    #1 arthurfok, 14 Nov 2012
    Last edited: 14 Nov 2012
  2. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Я предлагаю для начала ознакомиться с понятимями синхронности и асинхронности.
    ТЫЦ
    Так же нужно понимать, что асинхронность != многопоточность. Мне кажется вы немного путаете эти обозначения.

    По поводу записи в файл - основное время будет теряться при работе с файлом, то есть есть смысл заносить в файл не по 1 паролю, а большее количество. Если вы подобрали 100 паролей или аккаунтов, то вы пишите 100 * time_to_open&write. Нежели если вы один раз откроете файл и запишите 100 записей.
     
    1 person likes this.
  3. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Здесь узкий по времени момент - работа с сетью при бруте. При выводе в файл результатов используй буферизацию.
     
  4. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    186
    Reputations:
    5
    Соглашусь с написанным выше...
    кэшируй логи, а потом за раз сохраняй....
     
  5. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Если пишешь под Windows используй темповые файлы - они автоматически системой скидываются на диск при определенном размере - а до поры до времени это память.
     
    _________________________
  6. Белый Ворон

    Joined:
    7 Oct 2012
    Messages:
    46
    Likes Received:
    3
    Reputations:
    0
    лол. просто ЛОЛ. ачат такой ачат. уже трое дали один и тот же совет, с видами знатоков. смешной совет.
    Code:
        class Program
        {
            static void Main(string[] args)
            {
    
                
                Console.WriteLine(Benchmark(WriteLineByLine));
                Console.WriteLine(Benchmark(WriteThousandLines));
                Console.Read();
            }
    
            static void WriteLineByLine()
            {
                var list = new List<string>();
    
                for (int i = 0; i < 1000; i++)
                    list.Add(Path.GetRandomFileName());
                
                var writer = File.AppendText(Path.GetTempFileName());
                foreach (var line in list)
                {
                    writer.WriteLine(line);
                }
                writer.Close();
            }
    
            static void WriteThousandLines()
            {
                var list = new List<string>();
                 for (int i = 0; i < 1000; i++)
                    list.Add(Path.GetRandomFileName());
                
                File.AppendAllLines(Path.GetTempFileName(), list);
            }
    
            static long Benchmark(Action action)
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                action();
                sw.Stop();
                return sw.ElapsedMilliseconds;
            }
        }
    вот такой тест (тысяча строк, запись по одной строке vs запись сразу всех), вывел 7 и 5 миллисекунд соотвественно. разница в 2 миллисекунды(!). вы потратили в сотни тысяч больше времени на написание ответов. его софт столько времени не потратит на записи в файл за все время своего существования. и не думаю что софт ТСа сможет брутить в огромных количествах, таких чтобы почувствовать разницу.
    но зато если он будет писать по строке сразу, то он не потеряет данных. а если порциями - то пачка паролей может пропасть.
    ps преждевременная оптимизация - зло (с)
    никогда не делайте выводов о производительности кода, не проведя тесты.
    pss синхронизация забирает времени столько, сколько выполняется код, который находится в крит. секции + еще немного. в-общем все зависит от программиста и его кода опять же.
     
    #6 Белый Ворон, 14 Nov 2012
    Last edited: 14 Nov 2012
  7. ChymeNik

    ChymeNik Member

    Joined:
    31 Aug 2010
    Messages:
    29
    Likes Received:
    7
    Reputations:
    9
    InitializeCriticalSection/EnterCriticalSection/LeaveCriticalSection.
     
  8. FunOfGun

    FunOfGun Elder - Старейшина

    Joined:
    5 Sep 2012
    Messages:
    388
    Likes Received:
    72
    Reputations:
    124
    Это если софт однопоточный, в многопоточном прийдется еще проверять, не пишет ли другой поток в этот файл сейчас.
    Lock и запись в MemoryStream имхо разумнее, хоть и прийдется выделить еще один поток для сброса данных на диск.
     
  9. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Я соглашусь только в одном - ачат, такой ачат.
    А остально я хотел бы немного потроллить, думаю никто возражать не будет.

    Вначале хотел бы затроллить сию строку:
    Я представляю как бы ты тестировал нагрузки на БД:
    "А давайте сделаем креш-тест и попробуем записать 1000 записей в бд в течении минуты!" - Оуе! Сервера будут падать на ура! :D
    А попробуй-ка сделать такую же запись, только когда софт запилин не тупо под запись в файл, а делает икс операций - ну например брутит в 100 потоков. Да и причём не 1000 записей к ряду, а постоянный дёрг.
    По поводу разницы всего в 2 милисекунды - вопервых две милисекунды - это 28,57%. Херня ведь правда, особенно если работать не с 1000 строк, а ну скажем в 10°7.
    На этом можно было бы остановиться - но нет, я потролю дальше.
    Ну да - магия. Особенно наглядет пример с 1000 строк - они точно "потеряются".
    Я бы ещё понял если бы речь шла о больших размерах записей. А так, хули, (простите мой францусский) буфер вообще не нужен.
    Я не слишком толсто троллю? Вы скажите если что. А так идём дальше.

    Вспомнился сериал "Теория большого взрыва" и фраза Говарда:
    - "Сергей Андреевич, а долго будет инсталлироваться ВиндоуЗ?"
    - "Да фигня! Пять минут и ещё немного!"

    Я надеюсь меж строк прочитали все. :cool:
     
  10. Белый Ворон

    Joined:
    7 Oct 2012
    Messages:
    46
    Likes Received:
    3
    Reputations:
    0
    давай код теста. или опять мне писать?
    можно участок кода
    writer.WriteLine(line);
    просто завернуть в lock и все будет видно.

    ps у меня там кстати ошибка - создание и заполнение списка строк тоже попало в бенчмарк, хотя к задаче отношение не имеет. без этого участка результаты еще лучше.

    pss ну будешь ты в МемориСтрим писать - проблема потери данных не решится. выключили свет, случайно нажали на кпопку выключения, по каким-либо причинам сдох процесс - и все, сбрученные пароли утеряны. стабильность в работе с данными - гораздо важнее, чем сэкономить 2 миллисекунды, из часа работы софта.
     
  11. Белый Ворон

    Joined:
    7 Oct 2012
    Messages:
    46
    Likes Received:
    3
    Reputations:
    0
    ахах. действительно ты тролль, и не более.
    если ты работу с файлом переводишь на работу с бд, нам с тобой не по пути.
    напомню: брут, текстовый файл. Окда?

    еще раз: тема о бруте.
    28% это 28%. принципы оптимизация софта знаете? находим слабое место, его оптимизируем. запись в файл в бруте - не самое слабое место.
    напомню, необходимо записывать 1000 паролей в секунду, чтобы потерять 2 миллисекунды за одну секунду. тут во-первых, 2 мс в секунду это 0.2% от проц. времени (если даже 1 поток), во-вторых что-то сдается мне что 1000 ппс у ТСа в бруте не будет :D
    можно еще эти 0.2% смело делить на несколько десятков раз.
    кто вас так топорно мыслить приучил.
    что-то может быть хорошим там, где оно нужно. а где оно не нужно - оно там и не нужно. здесь буффер не нужен.

    ps ну да, я понял. критику не любим, поймали butthurt, но надо же что-то ответить, пусть и путем отхода от темы и задачи (например в сторону БД) и разведением сферических коней в вакуумных стойлах, попутно язвя, чтобы не было так обидно.
     
  12. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Не вникая в суть задачи, создал бы для каждого потока темповый файл и работал бы в каждом потоке со своим дескриптором. При закрытии открытого дескриптора все данные автоматически из памяти скидываются на диск. За все остальное отвечает сама система.

    100 потоков 1000 потоков, скорости не прибавит, а наоборот убавит засечет переключения контекста... число потоков должно ровняться числу ядер.
     
    _________________________
  13. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Не всегда, если есть какието длительные паузы в работе потоков то разница будет даже при большем кол-во потоков чем кол-во ядер, т.к например портоки будут ждать ответа от сервера.
     
  14. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Не понимаю, зачем такой хитрый способ? Достаточно выводить строки с каждого потока в один файл, используя буферизацию.
    При работе с сетью с помощью блокирующих сокетов прибавит.
     
    #14 Chrome~, 16 Nov 2012
    Last edited: 16 Nov 2012
  15. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    2 mironich, Chrome~

    при работе с сетью на блокирующих сокетах есть такое понятие как асинхронность (событийная модель) epoll, IOCP.

    Все зависит от задачи, не буду спорить :)
     
    _________________________
  16. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Асинхронность только для неблокирующих сокетов.
     
  17. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    2 Chrome~, поторопился я умничать :)

    Дабы не вводить людей в заблуждение - действительно для работы с epoll сокеты необходимо перевести в неблокирующий режим.
     
    _________________________
  18. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    О_о. Бля такой концерт пропустил, фпезду. ТС, а почему не создать один поток для записи в файл, и передавать в него данные через queue допустим? Никаких эксепшенов, Да и скорость не страдает.
     
  19. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Белый Ворон ну вообще да, без разницы, сразу в файл пишешь или по частям, разницы практически нет, но тут есть другой момент со входом выходом из критической секции, логично было бы по определенном количеству в потоке кэшировать строки, а потом их сразу записывать уже в критической секции. У меня был такой момент на практике, в лог(TListView) около 50-ти потоков записывали информацию, в конечном итоге главный поток конкретно подвисал, пришлось сделать механизм описанный выше.
     
  20. Белый Ворон

    Joined:
    7 Oct 2012
    Messages:
    46
    Likes Received:
    3
    Reputations:
    0
    Jingo Bo
    у тебя "главный" поток подвисал, потому что TListView работает куда медленнее чем запись в файл ;) это первый момент. а второй момент в том, что простая критическая секция работает намного быстрее, чем TThread.Synchronize