### Create and Delete Threads (OS/2)

The mechanisms for creating and deleting threads with IBM C and C++ Compilers are:

- _beginthread and _endthread from the multithread libraries
- DosCreateThread and DosExitThread from the OS/2 API
- IThread from the IBM Open Classes

_beginthread and _endthread
The multithread libraries provide these two functions to create new threads and to end them. You should use _beginthread to create any new threads that call IBM C and C++ Compilers library functions. When the thread is started, the library environment is initialized and ensures that resources and data are handled correctly between threads.

IBM C and C++ Compilers does not limit the number of threads you can create, but the OS/2 operating system does. The IBM C and C++ Compilers product also provides the global variable _threadid that identifies your current thread, and the function _threadstore that gives you a private thread pointer to which you can assign any thread-specific data structure.

DosCreateThread and DosExit
You can also create threads with DosCreateThread. The function that is to run on the thread created by DosCreateThread must have _System linkage. If you need to start a new thread for a function with any other type of linkage, you cannot use DosCreateThread.

Threads created by DosCreateThread do not have access to the resource management facilities or to IBM C and C++ Compilers exception handling. You must use a #pragma handler directive for the thread function to ensure correct exception handling. You should also call _fpreset from the new thread to ensure the floating-point control word is set correctly for the thread. Although you can use DosExit to end threads created with _beginthread, you should use _endthread to ensure that the necessary cleanup of the environment is done.

IThread
The start member function of the IThread class is used to start new threads. This member function has three overloaded versions and three corresponding constructors for:

- Functions compatible with _beginthread; that is, functions that have OS/2 linkage, take one argument of void* type, and return void.
- Functions compatible with DosCreateThread; that is, functions which have _System linkage, take one argument of unsigned long type, and return void.
- Other functions.

Because IThread can handle functions that fall under both static and dynamic thread control mechanisms, and those that do not, it is the preferred thread handling mechanism. Unlike _beginthread, you do not have to explicitly call _endthread to clean up the environment, and unlike DosCreateThread, you do not have to write your own exception handler.

You can use the IThread class in your multithread programs to accomplish several tasks:

- Set thread priority
- Set thread attributes
- Do a reference count for objects dispatched on a thread so they are automatically deleted when the thread ends
- Dispatch a member function of a C++ object on a separate thread
- Control other aspects of your threads

Multithreaded Applications

Use the Multithread Libraries
Terminate Execution with Multiple Threads