# Single-/Multi-threaded Communication

A client or server that supports both single and multi-threaded apartments will have one multi-threaded apartment, containing all threads initialized as free-threaded, and one or more single-threaded apartments. Interface pointers must be marshaled between apartments but can be used without marshaling within an apartment. Calls to objects in a single-threaded apartment will be synchronized by OLE. Calls to objects in the multi-threaded apartment will not be synchronized by OLE.

All of the information on single-threaded apartments applies to the threads marked as apartment model, and all of the information on multi-threaded apartments applies to all of the threads marked as free -threaded. Apartment threading rules apply to inter-apartment communication, requiring that interface pointers be marshaled between apartments with calls to CoMarshalInterThreadInterfaceInStream and CoGetInterfaceAndReleaseStream, as described in the Single-threaded Apartments section. For information on free-threading, see the Multi-threaded apartments section. Some special considerations apply when dealing with in-process servers, as described in In-process Server Threading Issues.