Re: COM Apartments - Message Loops
Ron Ayoub <ronaldayoub@yahoo.com> wrote:
My question is basic. Lots of articles say that when CoInitialize() is
called a thread enters an STA and a message loop is created INTERNALLY
in order to serialize calls to the objects created in that STA.
Can you cite one such article? STA apartment _requires_ a message pump,
but does not automatically _provide_ one. It is the responsibility of
the thread entering STA to run a message pump if it wants to accept
incoming cross-apartment calls.
Lots
of articles also say that you have to create and pump message
EXPLICITLY if you expect cross apartment interaction to occur. This
latter one is kind of strange to me since I've done lots of
programming of server applications that don't have any message loop
at all and they enter into an STA at the start and spawn numerous
threads and there is no problem with these numerous threads
interacting with objects created in separate threads.
These applications probably violate COM rules by calling STA objects
from worker threads without proper marshalling. Neither the compiler nor
the runtime will stop you from calling a thread-unsafe object
concurrently from multiple threads. You might even get away with it for
a while, until a race condition bites you at the most unfortunate
moment.
Is it because
all threads are in a single STA.
You do realsize that STA stands for "single-threaded apartment", right?
As in the apartment that can only ever contain one thread?
In that case, the literature that
claims one thread per STA is also wrong or misleading in some manner.
The literature is correct in this regard.
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925