To create optimized and efficient programs, note the following:
- It is unsafe to modify or add environment variables in a threaded application on Linux systems. This is due to limitations
of the underlying system libraries. It is however safe to read values from environment variables.
- Always add code to your application that checks whether the application is running under the single-threaded or multi-threaded
- Use the NOREENTRANT and NOSERIAL Compiler directives (the default) wherever possible. This minimizes stack space and call
entry overhead but it is up to the programmer to ensure that a program that uses these directives is only active in one thread
at a time.
- The use of the REENTRANT(1) Compiler directive increases stack space usage but does not significantly affect the call speed
of the program.
- The use of the SERIAL program attribute significantly affects the speed of calls but does not affect the stack space requirements
of the program.
- Use the Local-Storage Section to hold thread work variables. While this increases stack space requirements, the allocation
of data is very fast.
- Using the Thread-Local-Storage Section significantly effects call speed. Replacing the Working-Storage Section with the Thread-Local-Storage
Section is an easy way to make some applications to be made entirely thread-safe.
- Use mutexes for simple locking. These are the fastest of the synchronization structures.
- Use monitors to provide maximum multi-threading in programs that might cause readers and writers based problems.
- If possible, initialize all synchronization data items while in single-threaded execution. If this is not possible, then use
a first time flag which is checked once before a CBL_THREAD_PROG_LOCK and checked again after obtaining the lock.
- Remember the difference between a thread and a thread handle. Create a non-detached thread only if necessary.
- Use CBL_THREAD_KILL only if absolutely necessary and if you do use it, terminate the run-unit as soon as possible afterwards.
Where possible, use termination polling instead.
- Use CBL_THREAD_SUSPEND in preference to CBL_THREAD_YIELD. Avoid busy waits.
- Keep the amount of work done between CBL_THREAD_LIST_START and CBL_THREAD_LIST_END calls to a minimum.
- In certain circumstances, the application can conserve per thread memory by using the CBL_TSTORE_n routines in preference
to the Thread-Local-Storage Section.
- Try to avoid deadlock rather than attempting to correct it once it has occurred.
- Avoid nesting read locks on monitors and, if you must, then be aware of the possibility of single thread deadlock.
The Compiler directives available for multi-threaded applications can affect the performance of your multi-threaded and single-threaded