Есть ли способ обеспечить синхронное уничтожение в потоке выполнения для объекта указателя COM? - PullRequest
0 голосов
/ 16 апреля 2020

Я знаю, что когда вы создаете и выпускаете класс CComPtr, ссылка увеличивается и уменьшается. Когда ссылка достигает 0, интеллектуальный COM-указатель разрушается.

Я не очень уверен, как COM работает в отношении параллелизма. Если я сброслю / отпущу свой CComPtr, содержащий последнюю ссылку, могу ли я полностью гарантировать, что в следующем lo c деструктор был полностью выполнен?

Я хочу знать, уменьшается ли ссылка и вызов деструктора произойдет в том же потоке, что и сброс последнего указателя com. Я слышал, что обычно это какой-то поток COM, который действительно заботится об этом. Если это так, есть ли способ синхронизировать уничтожение COM с вашим основным рабочим потоком?

1 Ответ

0 голосов
/ 16 апреля 2020

Поскольку установка интеллектуального указателя на nullptr косвенно вызывает IUnknown::Release(), это просто вызов другой функции, поэтому он зависит от текущей модели (см. CoInitializeEx () ).

Если это MTA, освобождение происходит в потоке, который вы называете. Если это STA, выпуск сериализуется. Смысл STA в том, чтобы избежать ручной синхронизации.

Подробнее о COM-квартирах здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...