Какой поток в процессе надо считать первичным? (про Джефри Рихтера)

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 22 окт 2009.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    То есть у Джефри Рихтера при создании нового процесса такая хронология потоков:

    1) "происходит обращение к стартовой функции из библиотеки С/С++"
    2) "Закончив эти операции, стартовая функция обращается к входной функции в Вашей программе".
    (Добавлю, что это main, wmain, WinMain или wWinMain. )

    То есть как бы два потока сперва один (поток X) потом второй (поток Y). Но вот в главе "потоки" читаем:

    "Каждый поток начинает выполнение с некоей входной функции. В первичном потоке таковой является main, wmain, WinMain или wWinMain."

    Так всё-таки поток X первичен (пользу этого говорит: этот поток выполняется в адресном пространстве текущего процесса и по хронолоиги он перед потоком Y)?

    Или поток Y (В пользу этого говорит, что в этом потоке присутствует одна из упомянутых четырёх функций)?
     
  2. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Помоигите разобраться, пожалуйста и спасибо заранее.
     
  3. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    а что значить "первичный"? тот который первый на выполнение запускается? ну есть такой, ессно. а в чем проблема?
     
  4. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ну да. Меня щас интересует поток, который в процессе запускается первым. Если никого это не оскорбит, предлагаю в этой теме хотя бы, называть его первичным.

    Так вот.
    У Джефри Рихтера сказано, что первым запускается поток, начинающийся с такой-то и такой-то входной функции.
    (main, wmain, WinMain или wWinMain)
    Ну, раз так, он первичный.

    Но в другом месте сказано, что управление на эту функцию переходит из другого участка кода.
    И этот другой участок кода- как его идентифицировать, не знаю, X ли Y или ещё как-нибудь выполняется перед main, wmain, WinMain или wWinMain.

    Ну, короче, в одном процессе выполняются два потока и оба первые и оба первичные, следовательно.
    Ну, вот противоречие.
    Не могли бы Вы его разъяснить.
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    это не значит что создаётся новый поток.
     
  6. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Это ничего не проясняет. Ещё больше бы не запутало. Ведь тогда имеем (по Джефри Рихтеру же)

    Значит, первичный поток начинается с одной из функций. Вот
    "Каждый поток начинает выполнение с некоей входной функции. В первичном потоке таковой является main, wmain, WinMain или wWinMain."

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

    Собсно, я раньше в этой теме 2 потока рассматривал, а теперь один. Первичный.

    Но когда он начинается- остаётся загадкой.
    То ли с одной из этих функций, то ли раньше, когда "происходит обращение к стартовой функции из библиотеки С/С++"
     
  7. reversecode

    reversecode Guest

    Публикаций:
    0
    выбросте рихтера и скачайте нормальную windows inside
    где расписано что и как создаеться и запускаеться
     
  8. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    фууу.
    когда вы создаете поток, надо ж указать с какого места он должен выполняться? это может быть функция или вообще любой адрес доступный для выполнения. и он будет выполняться пока вы его не остановите, сделаете ошибку или не исчерпаете стек (тут по разному). вот и все. а все эти первичности/вторичности только запутывают. в выни нет парентальной связи между потоками, как и между процессами. есть только принадлежность потока процессу, а процесса заданию
     
  9. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Листать потоки чекая начальный адрес и сравнивая с EntryPoint экзешника.
     
  10. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Не надо вводить новых терминов, их и так хватает.
    Есть главный поток. Он начинается с EntryPoint программы (ЭТО НЕ ОБЯЗАТЕЛЬНО main, wmain, WinMain или wWinMain) Это зависит от настроек линкера.
    Это вы сам придумали?
    При чем тут Рихтер?
    Если вы хотите разобраться в механизме инициализации и создания потока, то вам не рихтер нужен. Читайте про загрузчик Windows
     
  11. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Нет, не сам я придумал. Простоn0name предположил, что если начинается одна из входных функций, то это не значит, что начинается новый поток. Вот что она сказал:
    "это не значит что создаётся новый поток."

    То есть не факт, что если начала одна из этих функций выполняться, что она является функцией потока.

    Вот я процитировал
    "Закончив эти операции, стартовая функция обращается к входной функции в Вашей программе".

    То есть была стартовая функция и она обратилась к одной из входных функций.
    Обе- в адресном пространстве процесса.

    И где в этом случае начался первичный поток- никто не знает.
    То ли со стартовой функции, то ли с одной из входных.
    А по Рихтеру то так, то эдак.
     
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    amvoz
    n0name вам все верно сказал. А вы перековеркали.
    Вот как раз факт. Это будет функция главного потока.
    Главный поток программы начинается со стартовой функции. Не придумывайте новых теорий.
    Выходная функция - вы определитесь откуда вы выходите - из какой-то процедуры, или из программы.
    В общем читайте матчасть внимательно - ибо у вас каша в голове.
     
  13. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ну я же с Вами не спорю.
    Будем исходить тихо-мирно из того, что Вы написали.
    Итак, стартовая функция есть начало главного потока. Всё понятно на уровне представления даже.

    А теперь открываем Джефри Рихтера и читаем:

    "Каждый поток начинает выполнение с некоей входной функции. В первичном потоке таковой является main, wmain, WinMain или wWinMain."

    Добавлю, что ни одна из этих функций не является стартовой. По Рихтеру же.

    ...Вы если противоречия не видите между Вами и Рихтером, или просто у Рихтера, Вы не отвечайте, не тратьте зря время. Мне надо разрешить противоречия.
    А все возможные варианты, что чем является, я и сам могу перебрать.
     
  14. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Пустить из своей проги поток, посомтреть откуда он начинаеться через ZwQueryInformationThread, это бует BaseThreadStart, дальше все что начинаеться не с этого адреса - соответственно начинаеться с BaseProcessStart - это и есть первые потоки
     
  15. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Чет мне показалось что задача была определить первый поток в процессе, так шо офтоп.
     
  16. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    amvoz
    Ну не стал Рихтер углубляться, и повторять, что при старте программы (создании первичного потока) управление сначала передаётся на какую-нибудь WinMainCRTStartup (та самая «стартовая функции из библиотеки С/С++»), которая уже вызывает WinMain. Поэтому вы запутались и из-за этой фразы решили, что создаётся новый поток.
     
  17. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    Так а в чем проблема? Винда для одного и того же ПЕ может по-разному определять точку входа?
     
  18. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    iZzz32

    Выполнение первого потока любого процесса созданного через CreateProcess начинается с kernel32.dll!BaseProcessStartThunk, а WinMainCRTStartup -- это дефолтный entrypoint С++ программ =)
     
  19. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Velheart
    Ну если быть уж совсем точным... :), то поток стартует из ядра с точки KiThreadStartup.
     
  20. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    l_inc
    эх, жалко клерка нету. ато ТС разобрался бы и с рихтером и с потоками и с проганьем надолго.