| |||
| Home > The C and C++ Libraries > Writing reentrant and thread-safe code > Using the ARM C libraries with a multithreaded application | |||
In order to use the ARM library in a multithreaded environment, you must provide:
An implementation
of __user_perthread_libspace() that returns
a different block of memory for each thread. This can be achieved
by either:
returning a different address depending on the thread it is called from
having a single __user_perthread_libspace block
at a fixed address and swapping its contents when switching threads.
You can use either approach to suit your environment.
You do not have to re-implement __user_perproc_libspace unless
there is a specific reason to do so. In the majority of cases, there
is no requirement to re-implement this function.
Implementations of the three mutex functions (see Managing locks in multithreaded applications).
In some applications these functions might not do anything useful. For example, a co-operatively threaded program does not have to take any steps to ensure data integrity, provided it avoids calling its yield function during a critical section. However, in other types of application, for example where you are implementing pre-emptive threading or in a Symmetric Multi-Processor (SMP) model, these functions play an important part in handling locks.
A way to manage multiple stacks.
A simple way to do this is to use the ARM two-region memory model (see The memory models). Using this means that you keep the stack that belongs to the primary thread entirely separate from the heap. Then you must allocate further memory for additional stacks from the heap itself.
Thread management functions, for example, to create or destroy threads, to handle thread synchronization, and to retrieve exit codes.
The ARM C libraries supply no thread management functions of their own and so you must supply any that are required.
A thread-switching mechanism.
The ARM C libraries supply no thread-switching mechanisms of their own. This is because there are many different ways to do this and the libraries are designed to work with all of them.
When these requirements have been met, you can use the ARM C libraries in your multithreaded environment:
some functions work independently in each thread
some functions automatically use the mutex functions to mediate multiple accesses to a shared resource
some functions are still non-reentrant and so a reentrant equivalent is supplied
a few functions remain non-reentrant and no alternative is available.
See Thread-safety in the ARM C libraries and Thread-safety in the ARM C++ libraries for full details.