A Natural process on Windows or Linux always contains only one thread that executes Natural code. Thus in an interactively started Natural session, it can never occur that several threads try to execute Natural code in parallel. The situation is different when a client program that runs several threads in parallel uses the Natural Native Interface.
The Natural Native Interface can be used by multithreaded applications. The interface functions are thread safe. As long as a given thread T is executing one of the interface functions, other threads of the same process that call one of the interface functions are blocked until T has left the interface function. Effectively the parallel executing threads of the process are serialized as far as the usage of the interface functions is concerned. It is not necessary to serialize interface access among the threads of different processes, because each different process that uses the NNI runs its own Natural session.
The calling application can also control the multithreaded access to the NNI explicitly.
This can make sense if a thread wants to execute a series of NNI calls without being
interrupted by another thread. To achieve this, the thread calls nni_enter
, which lets the thread wait
until all other threads have left the NNI. Then the thread does its work and calls NNI
functions at will. After having finished its work, the thread calls nni_leave
to allow other threads to access
the NNI.
A multithreaded application that uses the NNI must follow these rules:
The functions nni_initialize
and nni_uninitialize
must be called at least once per
process.
The function nni_uninitialize
must be called on the same thread as the
corresponding call to nni_initialize
.
The function nni_uninitialize
must not be called before the last thread
that uses the NNI has terminated.