При уничтожении ISomeClass в методе FinalRelease (я использую ATL) проиходит уничножение пула потоков. Последовательно гасятся все рабочие потоки, но если это просиходит в момент Worker::Execute(...) то получается deadlock, т.к. с одной сотороны объект разрушается в основном потоке, а с другой стороны при выходе из области видимости загшлушки CComPtr<ISomeClass> p_some_class тоже вызывается Release, который так же переадресовывается основному объекту. Соотвественно, рабочий поток, нормальным образом завершится не может.
Мне пока пришла у меня 2 идеи как этого избежать:
1. проставлять какой-нить флаг, в рабочем потоке делать так :
Worker::Execute(...)
{
if (p_some_class.destorying)
{
p_some_class.Detach(); // чтобы избежать вызова Release()
}
}
но так вроде будет лик?
или еще
2. Вариант перекрыть Release для ISomeClass и вызывать остановку рабочих потоков,раньше, но не понятно, когда именно
[]
MW>Теперь, собственно в чем проблемма :
MW>При уничтожении ISomeClass в методе FinalRelease (я использую ATL) проиходит уничножение пула потоков. Последовательно гасятся все рабочие потоки, но если это просиходит в момент Worker::Execute(...) то получается deadlock, т.к. с одной сотороны объект разрушается в основном потоке, а с другой стороны при выходе из области видимости загшлушки CComPtr<ISomeClass> p_some_class тоже вызывается Release, который так же переадресовывается основному объекту. Соотвественно, рабочий поток, нормальным образом завершится не может.
Почему не может нормально завершиться? По идее заглушка должна следить за своим объектом. Все должно само разруливаться.
Попробуй не ручками маршалить, а через GIT
MW>Что многоуважаемый All думает по этому поводу?
После того, как ты в FinalRelease послал своим потокам евент о том, что надо завершиться — нужно ждать эти потоки с циклом выборки сообщений, CoWaitForMultipleHandles,AtlWaitWithMessageLoop, MsgWaitForMultipleObjects
А решение с отдельным потоком — изврат
И ещё вопрос, а какого у тебя вообще происходит разрушение обьекта, если потоки держат на него ссылку?
Здравствуйте, Tom, Вы писали:
MW>>Что многоуважаемый All думает по этому поводу? Tom>После того, как ты в FinalRelease послал своим потокам евент о том, что надо завершиться — нужно ждать эти потоки с циклом выборки сообщений, CoWaitForMultipleHandles,AtlWaitWithMessageLoop, MsgWaitForMultipleObjects
Tom>А решение с отдельным потоком — изврат
Tom>И ещё вопрос, а какого у тебя вообще происходит разрушение обьекта, если потоки держат на него ссылку?
Да, как и ожидалось фикс неудался. Не знаю, может это и какой-нибуть баг CThreadPool, но это вряд ли
Как так получается, что проихводит разрушение объекта — честно говоря не знаю. Думал, что это нормальное поведение. Т.к. заглушка существуюет сама по себе, а галвный объект — сам по себе.
Кст. если CoGetInterfaceAndReleaseStream, размерашаленному указателю не делать ->release. Это будет лик?