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

Тема в разделе "Общие вопросы по С и С++", создана пользователем Folderx, 31 окт 2007.

  1. Folderx

    Folderx Гость

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

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

    Pasha Гость

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

    Folderx Гость

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

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

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

    Over Well-Known Member

    Репутация:
    0
    Регистрация:
    4 июл 2007
    Сообщения:
    116
    Симпатии:
    0
    По этой теме почитай MSDN, раздел Processes and Threads и Interprocess Communication. В частности обрати внимание на API-функцию CreateThread.
     
  5. European

    Репутация:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    2
    Для: Folderx
    Судя по постановке вопроса, ты не очень хорошо представляешь предметную область. Вот тебе ссылка на толковую книгу: РИХТЕР. Почитаешь - многое станет понятно

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

    Folderx Гость

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

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

    Репутация:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    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]
    Так 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, раздел "Некоторые соображения по библиотеке С/С++"
     
  8. Pasha

    Pasha Гость

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

    Folderx Гость

    Репутация:
    0
    Да посмотрю посмотрю(это надо перезагружаться в виндовс, потому что формат chm у книжки)

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

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

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

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

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

    Folderx Гость

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

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

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

    Pasha Гость

    Репутация:
    0
    <!--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.
     
  12. European

    Репутация:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    2
    <!--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]
    Форк вроде же процессы создает?
     
  13. Kmet

    Kmet Well-Known Member
    Java Team

    Репутация:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    1.036
    Симпатии:
    8
    процессы, но на мой взгляд, "создает" не совсем правильный термин, скорее делает копию
     
  14. Pasha

    Pasha Гость

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

    Репутация:
    0
    Регистрация:
    4 сен 2006
    Сообщения:
    2.566
    Симпатии:
    2
    Для: Kmet
    Для: Pasha
    С линуксом вообще не дружу, так что не пинайте ногами
     
  16. Folderx

    Folderx Гость

    Репутация:
    0
    Нашёл пример кое-какой
    Код (Text):
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    Значит заголовочный файл pthread.h

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

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

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

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

    Kmet Well-Known Member
    Java Team

    Репутация:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    1.036
    Симпатии:
    8
    Для: Folderx
    я конечно извиняюсь, но какие бл*дь циклы... учи мат часть

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

    Pasha Гость

    Репутация:
    0
    Для: Kmet
    Устанавливаешь Windows Services for UNIX Version 3.5 и получаешь полностью POSIX совместимую винду, с поддержкой POSIX Threads. А если тебе повезло, и у тебя установлена Vista или 2003 R2, то и качать не надо, все уже встроено B)
     
  19. Folderx

    Folderx Гость

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

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

    Pasha Гость

    Репутация:
    0
    Для: Folderx
    Читай, бл*дь, матчасть. Какие испытания, какие еще "придется переключаться"? Полстраницы теории хватит, чтобы понять что переключения на себя ОС берет. И что одновременно остановить и запустить не получится.
     
Загрузка...
Похожие Темы - Как распараллелить процессы
  1. чернокнижник
    Ответов:
    4
    Просмотров:
    84
  2. Sniff
    Ответов:
    1
    Просмотров:
    77
  3. vultr_fan
    Ответов:
    3
    Просмотров:
    158
  4. OBLIVIONNN
    Ответов:
    3
    Просмотров:
    236
  5. OBLIVIONNN
    Ответов:
    2
    Просмотров:
    157

Поделиться этой страницей