Re: Doubts on mixed threading (FTM -Both ) objects
"buddie84" <firstname.lastname@example.org> wrote in message
Please help me to clarify these doubts
See the classes below
All CoClass here are marked "both" in registry and build with Free
Threded Marshaller support .
and thread safe
- non creatable
-client will create this class
- non creatable
- object of this class is exposed as a property of CoClass2
- STL collection which stores Variants of type VT_DISPATCH
// define the Enumerator interface
typedef CComEnumOnSTL< IEnumVARIANT,
std::vector< VARIANT > > MyEnumeratorType;
// define the collection interface
std::vector< VARIANT >,
MyEnumeratorType > MyCollectionType;
class CoClass2 : public IDispatchImpl< MyCollectionType
,&IID_Interface2,,,> //collection of class 1
//Add to ATL-STL collection
property get_Obj2Collection( Interface2 **arg)
static MyThread(void *p)
//MULTI Thread Apartment Begin
HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
CoClass3 *pCoClass3= (CoClass3*) p;
//MULTI Thread Apartment End
some function in CoClass3 will popup a thread and the context passed is
the object itself .
By doing this the object is entering to a new thread/apartment ,
I don't know what a "thread/apartment" is. I don't think such an animal has
ever been defined in COM. I also don't know how to "popup a thread". Do you
mean a thread is created?
If the thread is created, it must call CoInitialize(Ex) and declare what
apartment it will live in. If it is the same apartment as the parent thread,
then it joins the same apartment and there is no apartment boundary to
Objects are allowed to access directly from different apartments but
not interface pointers .
Am I correct here ?
Objects don't access other objects, but threads do. A thread can access an
interface pointer belonging to another thread if they are both in the same
MTA. Otherwise a thread should only use an interface pointer that is
properly marshaled across the apartment boundary.
if the above is Ok then
pCoClass1->m_pObj2->Add(pInter1 ); is legal ?
You can certainly do whatever you want with the address of the interface,
just don't dereference. Yes, this is legal. But pInter1->DoSomething() might
m_pObj2 object might be created on different apartment( single thread
is it ok to access it on a multi thread apartment ?
A thread that belongs to the MTA cannot use an interface pointer that was
created by a thread from another apartment. The interface pointer must be
marshaled so that the first thread (in the MTA) receives a pointer to a
storing the interface pointer ( pInter1) to collection ..
what will happen when client access this pointer from a different
Maybe nothing right away. But you have broken the laws of COM and likely
your application will blow up down the road.
Even If we keep a valid reference for "pInter1", is that going to be
invalid when we call CoUninitialize at the end ?
(I am sure it will become invalid on a single thread apartment )
All interfaces become invalid after CoUninitialize is called.
Remove the support for the free-threaded marshaller. It is clear from your
post that you don't know what it's for, so get rid of it. You don't need it
and you are likely to shoot yourself in the foot with it.