Для сервера ATL вне процесса, о котором уже позаботился конструктор CAtlExeModuleT. Он вызовет InitializeCom () в своем конструкторе. Когда вы #defined _ATL_FREE_THREADED, это автоматически произведет вызов CoInitializeEx (NULL, COINIT_MULTITHREADED), как и следовало ожидать. Код легко найти обратно в vc / atlmfc / include / atlbase.h
Вызовы метода интерфейса будут выполняться из заглушки потоком RPC, сам поток, который делает вызов, совершенно непредсказуем. Также довольно опасно, потому что RPC перезапускает потоки, а вызовы часто выполняются одним и тем же потоком. Но не всегда, в зависимости от того, сколько одновременных вызовов обрабатывается. Бремя поддержки свободной многопоточности состоит в том, чтобы гарантировать, что ваш код полностью поточно-ориентирован. Если у вас есть какие-либо ошибки типа тупиковой или многопотоковой гонки или вы полагаетесь на объект синхронизации, который имеет привязку к потокам, например Mutex, по нескольким вызовам, то они не испортят ваш день, пока сервер не будет сильно загружен. Обязательно проверьте это.