The following macros are available to specify the threading model of an ATL project:
| Macro | Guidelines for using | 
|---|---|
| _ATL_SINGLE_THREADED | Define if all of your objects use the single threading model. | 
| _ATL_APARTMENT_THREADED | Define if one or more of your objects use apartment threading. | 
| _ATL_FREE_THREADED | Define if one or more of your objects use free or neutral threading. Existing code may contain references to the equivalent macro _ATL_MULTI_THREADED. | 
If you do not define any of these macros for your project, _ATL_FREE_THREADED will be in effect.
The macros affect run-time performance as follows:
- Specifying the macro that corresponds to the objects in your project can improve run-time performance. 
- Specifying a higher level of macro, for example if you specify _ATL_APARTMENT_THREADED when all of your objects are single threaded, will slightly degrade run-time performance. 
- Specifying a lower level of macro, for example, if you specify _ATL_SINGLE_THREADED when one or more of your objects use apartment threading or free threading, can cause your application to fail at run time. 
See Options, ATL Simple Object Wizard for a description of the threading models available for an ATL object.