[Threads]DLLs

Тема в разделе "LANGS.C", создана пользователем [ixTor], 6 дек 2017.

  1. [ixTor]

    [ixTor] Member

    Публикаций:
    0
    Регистрация:
    5 янв 2017
    Сообщения:
    53
    Ребята почему у меня неполучается создать в длл поток?

    Код (Text):
    1.  
    2. BOOL APIENTRY DllMain (HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
    3. {
    4. switch (ul_reason_for_call)
    5. {
    6. case DLL_PROCESS_ATTACH:
    7. {
    8. Func1( NULL );//Здесь я выполняю какието действия с переменными
    9. //В потоке хочу запустить обработчик
    10. HANDLE  hThr=CreateThread(NULL, 0, &Func2, NULL, 0, NULL);
    11. Func3( NULL );//и здесь хочу запустить цикл обработчика
    12. }
    13. break;
    14. case DLL_THREAD_ATTACH:
    15. break;
    16. case DLL_THREAD_DETACH:
    17. break;
    18. case DLL_PROCESS_DETACH:
    19. break;
    20. }
    21. return TRUE;
    22. }
    23.  
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    В DllMain() нельзя создавать никаких циклов, тред создал и завершайся. Созданный тред не начнет выполняться, пока ты в DllMain(), потому что перед этим вызываются DllMain() остальных модулей для уведомления о новом потоке, а это происходит в крит. секции по очереди.
     
    Aiks нравится это.
  3. [ixTor]

    [ixTor] Member

    Публикаций:
    0
    Регистрация:
    5 янв 2017
    Сообщения:
    53
    тоесть можно при инициализации длл в DllMain создать два потока через CreateThread и потом когда оно оттуда выйдет то эти потоки создадутся нормально? я почемуто думал что вся работа в длл происходит в DllMain
    все правильно я понял?
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    @[ixTor],
    Создадутся они сразу, но выполняться начнут только после того, как загрузчик вызовет DllMain() всех (не отказавшихся от уведомлений о создании треда) dll в процессе, а делает он это по очереди, т.е. когда ты вернешь управление из своей DllMain().

    Смотря какая это работа. Если просто выделение памяти, чтение файлов/реестра и т.п., то можно прям в DllMain() делать, но если есть функции ожидания, длинные циклы, создание сокетов, то надо выносить все в отдельный поток, иначе может быть дедлок.
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    @[ixTor],

    Загрузчик это синхронный ресурс, пока он занят одним тредом, второй его выполнять не может. Если родитель начнёт синхронизацию, не освободив загрузчик, это приведёт к деадлоку(глобальной блокировке), вcе потоки зависнут. Даже те, которые отношения не имеют к тем двум потокам.
     
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775