• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Как распараллелить процессы

  • Автор темы Folderx
  • Дата начала
F

Folderx

Мне нужно чтобы два цикла работали одновременно, одновременно начались, одновременно проработали и одновременно закончились, только один в одну переменную значение запишет, а другой в другую.

Чо-то слышал когда программа вызывает саму себя с разными параметрами, а может есть какой-нибудь другой способ ?
 
P

Pasha

Для: Folderx
Слишком общий вопрос. Уточни хотя бы операционную систему, под которой собрался распараллеливать.
Да и насчет "одновременно закончились" - это вряд ли можно гарантировать.
 
F

Folderx

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

Одновременность ну это в смысле два цикла один будет работать 5 минут другой 7 минут программа будет работать 10 минут, надо чтобы за 10 минут циклы оба прошли(начались в одно время, первый цикл закончился за 2 минуты до окончания второго) и после окончания второго ещё место в три минуты осталось.

Ну и чтобы внешних программ, желательно чтобы вообще запускать не надо было. Может что-нибудь вроде копии программы в оперативную память загрузить и там чо-то как-то работать с точками входа в циклы(это я себе так представляю примерно).
 
O

Over

По этой теме почитай MSDN, раздел Processes and Threads и Interprocess Communication. В частности обрати внимание на API-функцию CreateThread.
 
E

European

Для: Folderx
Судя по постановке вопроса, ты не очень хорошо представляешь предметную область. Вот тебе ссылка на толковую книгу: . Почитаешь - многое станет понятно

Кроме того, как тебе уже сказал Паша, Windows (за исключение СЕ, насколько я знаю) не является системой реального времени. Поэтому гарантировать абсолютно точное соблюдение временных промежутков нельзя.
 
F

Folderx

Ладно ссылки протестил материал на будущее, короче как без винапи сделать два независимых цикла, есть возможность такая в С ?

Например солдаты в фаркрае ходят отдельно друг от друга и отдельно от меня, то есть мы три процесса, а можно такое в консоли сделать как-нибудь без винапи ?
 
E

European

<!--QuoteBegin-Folderx+31:10:2007, 11:53 -->
<span class="vbquote">(Folderx @ 31:10:2007, 11:53 )</span><!--QuoteEBegin-->короче как без винапи сделать два независимых цикла
[snapback]83752" rel="nofollow" target="_blank[/snapback]​
[/quote]
Так 2 цикла или 2 потока?<!--QuoteBegin-Folderx+31:10:2007, 11:53 -->
<span class="vbquote">(Folderx @ 31:10:2007, 11:53 )</span><!--QuoteEBegin-->Например солдаты в фаркрае ходят отдельно друг от друга и отдельно от меня, то есть мы три процесса
[snapback]83752" rel="nofollow" target="_blank[/snapback]​
[/quote]
А если с тобой 10-тысячная армия, то потоков 10 001 получается?
<!--QuoteBegin-Folderx+31:10:2007, 11:53 -->
<span class="vbquote">(Folderx @ 31:10:2007, 11:53 )</span><!--QuoteEBegin-->а можно такое в консоли сделать как-нибудь без винапи ?
[snapback]83752" rel="nofollow" target="_blank[/snapback]​
[/quote]
Открой книгу, на которую я тебе дал ссылку... Глава 6, раздел "Некоторые соображения по библиотеке С/С++"
 
P

Pasha

Для: Folderx
В общем случае в C такой возможности нет. Потому что работа с процессами и потоками сильно отличается для разных ОС. Есть сторонние библиотеки, позволяющие ее унифицировать, но лучше их как серьезное решение не рассматривать.
Солдаты в фаркрае ходят в одном процессе, да к тому же ходят дискретно. И движения мышки считываются дискретно. Да, еще картинка не мониторе не непрерывная, а состоит из отдельных кадров, но твое восприятие рассматривает часто меняющиеся картинки как непрерывное движение. Поэтому ящик, выполняющий 5-6 миллиардов операций в секунду, вполне справляется с отрисовкой 50-60 картинок в секунду из плоских треугольников. Одновременность хождения солдат - просто дырявая абстракция.
 
F

Folderx

Открой книгу, на которую я тебе дал ссылку... Глава 6, раздел "Некоторые соображения по библиотеке С/С++"
Да посмотрю посмотрю(это надо перезагружаться в виндовс, потому что формат chm у книжки)

Солдаты в фаркрае ходят в одном процессе, да к тому же ходят дискретно.
В смысле солдат шагнул, потом останавливается и ждёт пока второй шагнёт ?

Как они вдоём ходят то одинаково то по разному, или я иду они идут, я остановился они идут я иду они идут, это всё дискретно чтоли происходит, врятли...

Я думаю там солдаты в цикле, каждый солдат это цикл, каким-то образом одновременно запущенные, или если как Паша говорит, то нету никаких отдельных солдатов, один солдат запускает другого, или общий цикл солдат запускает попеременно то первого то второго то первого то второго. И таким макаром они идут оба попеременно.

Как тогда такое заранее продумывается ? А если лодку добавить, это потом по всей программе лодку вписывать кусками чтоли, врятли...

<!--QuoteBegin-European+-->
<span class="vbquote">(European)</span><!--QuoteEBegin-->Так 2 цикла или 2 потока?[/quote]
А ты сообщение самое первое в топике не читал ?
 
F

Folderx

Код:
Функция CreateThread
Мы уже говорили, как при вызове функции CreateProcess появляется на свет первичный поток процесса. Если Вы хотите создать дополнительные потоки, нужно вызывать из первичного потока функцию CreateThread:

HANDLE CreateThread(
PSECURITY_ATTRIBUTES psa,
DWORD cbStack,
PTHREAD_START_ROUTINE pfnStartAddr,
PVOID pvParam,
DWORD fdwCreate,
PDWORD pdwThreadID);
При каждом вызове этой функции система создает объект ядра "поток". Это не сам поток, а компактная структура данных, которая используется операционной системой для управления потоком и хранит статистическую информацию о потоке. Так что объект ядра "поток" — полный аналог объекта ядра "процесс".
Вроде чо-то нашёл в книжке, терь вопрос, а для линукса это как сделать ?

Мне нужно два потока(thread) создать в каждом по циклу и чтобы выводились на экран две переменные рядом - одна с одного цикла другая с другого.
 
P

Pasha

<!--QuoteBegin-Folderx+31:10:2007, 23:59 -->
<span class="vbquote">(Folderx @ 31:10:2007, 23:59 )</span><!--QuoteEBegin-->Как они вдоём ходят то одинаково то по разному, или я иду они идут, я остановился они идут я иду они идут, это всё дискретно чтоли происходит, врятли...

Я думаю там солдаты в цикле, каждый солдат это цикл, каким-то образом одновременно запущенные
[snapback]83860" rel="nofollow" target="_blank[/snapback]​
[/quote]Убедил. Солдаты ходят одновременно, и непрерывно. И выглядывают через щель дисковода, чтобы видеть когда ты ходишь и замираешь. Количество солдат ограничено. А в новые процессоры встраивают поддержку большего количества одновременных солдат, поэтому современные игры сложнее, чем были раньше. Если запустить новую игру на старой машине, то солдаты начинают шагать по очереди. А если старую игру на новой машине, то солдаты шагают быстрее, потому что циклы крутятся быстре. Поэтому дум уже невозможно пройти.
<!--QuoteBegin-Folderx+1:11:2007, 01:18 -->
<span class="vbquote">(Folderx @ 1:11:2007, 01:18 )</span><!--QuoteEBegin-->Вроде чо-то нашёл в книжке, терь вопрос, а для линукса это как сделать ?
[snapback]83862" rel="nofollow" target="_blank[/snapback]​
[/quote]Через fork.
 
E

European

<!--QuoteBegin-Pasha+1:11:2007, 12:32 -->
<span class="vbquote">(Pasha @ 1:11:2007, 12:32 )</span><!--QuoteEBegin-->Через fork
[snapback]83915" rel="nofollow" target="_blank[/snapback]​
[/quote]
Форк вроде же процессы создает?
 
P

Pasha

Для: European
fork делает копию. Про pthread_create объяснять дольше, да и не линуксойд я ;)
 
E

European

Для: Kmet
Для: Pasha
С линуксом вообще не дружу, так что не пинайте ногами
 
F

Folderx

Нашёл пример кое-какой
Код:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

Значит заголовочный файл pthread.h

Дальше там
Код:
pthread_t thread1, thread2;
Это видимо тип структуры такой.

Код:
pthread_create( &thread1, NULL, print_message_function,
(void*) &number1);
Это у нас видимо функция создания треда, которая обращается к одной из структур, далее выделяет ей идентификатор и прочую фигню там, короче это всё неважно.
Для второго треда тоже эта функция создаёт чо-то там.

Код:
pthread_join( thread1, NULL);
А дальше пример обрывается
Мне нужно записать в первый тред один цикл во второй другой цикл, структура треда явно не может содержать место для цикла, значит цикл пишется куда-то в другое место, куда писать цикл ?

Или же я проскочил вот этот момент pthread_create(.... тут возможно какая-то функция выполняемая (текущим для этого вызова) тредом....)
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
Для: Folderx
я конечно извиняюсь, но какие бл*дь циклы... учи мат часть

Для: European
Это не линукс, это POSIX =) Не удивлюсь, если есть какой нибудь аналог под виндовс, когда то давно заявляли что NT POSIX совместима=)
 
P

Pasha

Для: Kmet
Устанавливаешь и получаешь полностью POSIX совместимую винду, с поддержкой POSIX Threads. А если тебе повезло, и у тебя установлена Vista или 2003 R2, то и качать не надо, все уже встроено B)
 
F

Folderx

Kmet, короче отдыхай, не знаешь чо писать лучше вообще не пиши ничего.

Вроде нашёл куда циклы писать, скоро буду проводить испытания чтобы они одновременно запускались(они действительно пишутся в функцию). По ходу и вправду придётся между тредами переключаться, сейчас задача получить два независимых мультика. :)
 
P

Pasha

Для: Folderx
Читай, бл*дь, матчасть. Какие испытания, какие еще "придется переключаться"? Полстраницы теории хватит, чтобы понять что переключения на себя ОС берет. И что одновременно остановить и запустить не получится.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!