Информация об изменениях

Сообщение Re[5]: еще один вопрос от 06.02.2017 9:45

Изменено 06.02.2017 9:52 ononim

Re[5]: еще один вопрос
O>>Потому что потоку, чтобы завершиться, требуется захватить PEB loader lock — тот самый лок, который захватывается на время вызова DllMain. В результате — дедлок. Кстати чтобы потоку начать исполняться тоже требуется вначале сходить под этот лок, так что находясь в DllMain нельзя ждять не только завершения потока, но и вообще каких-либо действий с его стороны.
ksd>ответ: дедлок обходится евентом.
ksd>вопрос: что, таки DllMain морозит все потоки dll-ки?
Еще раз. Перед тем как начать исполнять ThreadRoutine и после его завершения поток на короткое время захыватывает PEB loader lock, которым накрыт DllMain. Так что пока какой то поток сидит внутри DllMain никакой другой поток не сможет завершиться окончательно или начать исполнение рутины.
Re[5]: еще один вопрос
O>>Потому что потоку, чтобы завершиться, требуется захватить PEB loader lock — тот самый лок, который захватывается на время вызова DllMain. В результате — дедлок. Кстати чтобы потоку начать исполняться тоже требуется вначале сходить под этот лок, так что находясь в DllMain нельзя ждять не только завершения потока, но и вообще каких-либо действий с его стороны.
ksd>ответ: дедлок обходится евентом.
ksd>вопрос: что, таки DllMain морозит все потоки dll-ки?
Еще раз. Перед тем как начать исполнять ThreadRoutine и после его завершения поток на короткое время захыватывает PEB loader lock, которым накрыт DllMain. Так что пока какой то поток сидит внутри DllMain никакой другой поток не сможет завершиться окончательно или начать исполнение рутины.
Ивент, если я правильно понял что вы с ним делать хотите, так же не гарантирует от неприятностей т.к. будут следуюшие гонки:
1) Поток может не успеть начать исполнение, то есть не дойти до начала вашей thread routine, если между запуском потока и выгрузкой длл пройдет очень мало времени, соответственно просигналить ваш ивент перед выходом он в таком случае не сможет.
2) Между сигналом ивента и покиданием потока вашего thread routine будут как минимум несколько инструкций. Если поток замешкается на них, а тем временем ваша длл выгрузится — будет крэш.
Вобщем, не ищите костыли, они имеют тенденцию оказываться граблями, а делайте нормально.