Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Бред в документации Майкрософта


Автор: nerdy_weirdie 11.10.2010, 06:45
Цитата
Thread synchronization is tricky because waiting on threads to exit in DllMain can cause a deadlock. For example, DLL A holds the loader lock. It signals thread T to exit and waits for the thread to exit. Thread T exits and the loader tries to acquire the loader lock to call into DLL A’s DllMain with DLL_THREAD_DETACH. This causes a deadlock. To minimize the risk of a deadlock:
DLL A gets a DLL_THREAD_DETACH message in its DllMain and sets an event for thread T, signaling it to exit.
Thread T finishes its current task, brings itself to a consistent state, signals DLL A, and waits infinitely. Note that the consistency-checking routines should follow the same restrictions as DllMain to avoid deadlocking.
DLL A terminates T, knowing that it is in a consistent state.

Как можно отдать потоку команду на завершение из DllMain по сообщению DLL_THREAD_DETACH, если эту самую DllMain с этим сообщением вызывает сам поток и уже после выхода из основной процедуры? Что они имели ввиду?  smile 

Автор: GremlinProg 11.10.2010, 10:35
тут просто сказано, что нет смысла пытаться что-либо синхронизировать в dllmain'е, т.к. сам вызов dllmain эксклюзивный, т.е. он блокирует любые одновременные попытки войти в dllmain, поэтому любой барьер тут приведет к дедлоку

Автор: nerdy_weirdie 11.10.2010, 10:44
Это совершенно понятно. Меня интересует рецепт решения, который написан после двоеточия. Приведен фрагмент из статьи описывающей возможные проблемы при создании длл и пути их решения.

Автор: GremlinProg 11.10.2010, 11:04
после двоеточия описан рецепт выхода из ситуации, описанной перед двоеточием,
т.е. по завершении длл А (из какого-то потока), она пытается подождать завершения определенного потока T
(очевидно вот таким вот макаром: WaitForSingleObject( T, INFINITE ) ),
что естественно приводит к дедлоку

вот они и пишут, что мол если нужно синхронизировать завершение потока T в dllmain,
то какой-то конец этой синхронизации надо оставить за пределами dllmain:

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

Добавлено @ 11:09
т.е. что-то вроде такого:
Код

... thread( ... ){
  for( Code = WAIT_TIMEOUT ; Code == WAIT_TIMEOUT ; ){
    Code = WaitForSingleObject( hAbort, Timeout );
    ...
  }
  SetEvent( hSynch );
}

... dllmain( ... ){
  ...
  SetEvent( hAbort );
  WaitForSingleObject( hSynch, INFINITE );
  ...
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)