Thread attributes

QNX SDP8.0System ArchitectureDeveloperUser

Although threads within a process share everything within the process's address space, each thread still has some private data. Some of this private data is protected within the kernel (e.g., the tid or thread ID), while other private data resides unprotected in the process's address space (e.g., each thread has a stack for its own use).

Some of the more noteworthy thread-private resources are:

tid
Each thread is identified by an integer thread ID, starting at 1. The tid is unique within the thread's process.
Priority
Each thread has a priority that helps determine when it runs. A thread inherits its initial priority from its parent, but the priority can change, depending on the scheduling policy, explicit changes that the thread makes, or messages sent to the thread. For more information, see Thread scheduling, later in this chapter.
Note:
In the QNX OS, processes don't have priorities; their threads do.
Name
You can assign a name to a thread; see the entries for pthread_getname_np() and pthread_setname_np() in the C Library Reference. Utilities such as dumper and pidin support thread names. Thread names are a QNX OS extension.
Register set
Each thread has an instruction pointer (IP), stack pointer (SP), and other processor-specific register context.
Stack
Each thread executes on its own stack, stored within the address space of its process.
Signal mask
Each thread has its own signal mask.
Thread local storage
A thread has a system-defined data area called thread local storage (TLS). The TLS is used to store per-thread information (such as tid, pid, stack base, errno, and thread-specific key/data bindings). The TLS doesn't need to be accessed directly by a user application. A thread can have user-defined data associated with a thread-specific data key.
Cancellation handlers
A thread can have callback functions that are executed when it terminates.

Thread-specific data, implemented in the pthread library and stored in the TLS, provides a mechanism for associating a process global integer key with a unique per-thread data value. To use thread-specific data, you first create a new key and then bind a unique data value to the key (per thread). The data value may, for example, be an integer or a pointer to a dynamically allocated data structure. Subsequently, the key can return the bound data value per thread.

A typical application of thread-specific data is for a thread-safe function that needs to maintain a context for each calling thread.

Figure 1Sparse matrix (tid,key) to value mapping.

Sparse matrix (tid,key) to value mapping

You use the following functions to create and manipulate this data:

Function Description
pthread_key_create() Create a data key with destructor function
pthread_key_delete() Destroy a data key
pthread_setspecific() Bind a data value to a data key
pthread_getspecific() Return the data value bound to a data key
Page updated: