Previous | Contents | Index |
Building your multithreaded program must produce executable code that is reentrant. Therefore, be sure that your compiler generates reentrant code before you design or code your multithreaded program. By default, the Compaq C, C++, Ada, Pascal, COBOL, FORTRAN and BLISS compilers generate reentrant code.
If you cannot build your program so that its executable code is reentrant, it might be impossible to keep the program's threads from interfering with each other. See Section 3.9.1 for more information about thread-reentrant libraries.
In general, when using threads, be aware of language-based programming practices that are inherently not thread-safe. ("Thread safety" is explained in Section 3.9.2.) You must address these factors when writing multithreaded applications and thread-safe libraries. For example, FORTRAN language routines typically rely heavily upon static storage, which can prevent those routines from being thread safe.
When you design and code a multithreaded program, you must also accommodate or eliminate, as appropriate, each of the following issues:
As a package, the POSIX Threads Library is a collection of shared code libraries and C language header files that declare entry points into those libraries. This guide's platform-specific appendixes describe these libraries in more detail and list all other libraries upon which the Threads Libraries depend.
From the programmer's view, the Threads Libraries offer interfaces. Each interface is a distinct set of routines that together provide a well-defined set of related data objects and operations.
This version of the Threads Library supports two interfaces that are documented in this guide:
This release of the Threads Library includes interface definitions for the C programming language only. However, all Threads Library routines are callable from languages other than C. Your application must provide its own declarations for Threads Library routines in a manner appropriate for its programming language. These definitions should be modeled after the declarations in the C language pthread.h header file.
For backward compatibility, this version of the Threads Library also supports other interfaces that are not documented in this guide. See Section 1.6.3.
Special note when using the Threads Library from non-C languages:
Several Threads Library features and most Threads Library identifiers
are provided as C language macros. As such, their definitions may not
be available in other languages. Developers working in other languages
will have to provide their own declarations of functions and constants.
Features such as
TRY/CATCH
exception handling and POSIX push/pop cleanup handlers may be
completely unavailable, although it may be possible to provide similar
functionality using native exception handling facilities. Note that in
this context, C++ is a non-C language; while the C language macros may
compile successfully under C++,
TRY/CATCH
and push/pop cleanup handlers are not supported for C++ code. C++ code
should use object destructors and C++ exception handlers.
1.6.1 The pthread Multithreading Interface
The pthread interface routines implement the IEEE Standard 1003.1-1996, Portable Operating System Interface (or POSIX) Application Program Interface, also known as POSIX.1. It also supports extensions specified in SUSV2 (UNIX98).
Table 1-1 lists and summarizes functionally the pthread interface routines.
The pthread interface contains routines grouped in the following functional categories:
The pthread interface also provides routines that implement nonportable extensions to the POSIX.1 standard. These routines are grouped in these functional categories:
Among the routines in the pthread interface that implement nonportable extensions to the POSIX.1 standard, are the routines in the Threads Library exception package. This package consists of a library and C language header file ( pthread_exceptions.h ) that implement an HP-specific exception-handling facility. It is designed specifically for use with the pthread interface. Chapter 5 describes the Threads Library exception package.
This guide also documents several routines that are not declared entries in the pthread interface, but that have close affinity with its functionality. Examples are the sched_yield() and sigwait() routines. See the end of Table 1-1 for a list of these routines.
Routine | Description |
---|---|
General Threads Routines | |
pthread_atfork() | Declares fork handler routines to be called |
pthread_create() | Creates a thread object and thread |
pthread_detach() | Marks a thread object for deletion |
pthread_equal() | Compares one thread identifier to another thread identifier |
pthread_exit() | Terminates the calling thread |
pthread_join() | Causes the calling thread to wait for the termination of a specified thread and detach it |
pthread_kill() | Delivers a signal to a specified thread |
pthread_once() | Calls an initialization routine to be executed only once |
pthread_self() | Obtains the identifier of the calling thread |
pthread_sigmask() | Examines or changes the calling thread's signal mask |
Thread Attributes Object Routines | |
pthread_attr_destroy() | Destroys a thread attributes object |
pthread_attr_getdetachstate() | Obtains the detachstate attribute of the specified thread attributes object |
pthread_attr_getguardsize() | Obtains the guardsize attribute of the specified thread attributes object |
pthread_attr_getinheritsched() | Obtains the inherit scheduling attribute of the specified thread attributes object |
pthread_attr_getschedparam() | Obtains the scheduling parameters for the scheduling policy attribute of the specified thread attributes object |
pthread_attr_getschedpolicy() | Obtains the scheduling policy attribute of the specified thread attributes object |
pthread_attr_getscope() | Obtains the contention-scope attribute of the specified thread attributes object |
pthread_attr_getstackaddr() | Obtains the stackaddr attribute of the specified thread attributes object |
pthread_attr_getstacksize() | Obtains the stacksize attribute of the specified thread attributes object |
pthread_attr_init() | Initializes a thread attributes object |
pthread_attr_setdetachstate() | Changes the detachstate attribute of the specified thread attributes object |
pthread_attr_setguardsize() | Changes the guardsize attribute of the specified thread attributes object |
pthread_attr_setinheritsched() | Changes the inherit scheduling attribute of the specified thread attributes object |
pthread_attr_setschedparam() | Changes the values of the parameters associated with the scheduling policy attribute of the specified thread attributes object |
pthread_attr_setschedpolicy() | Changes the scheduling policy attribute of the specified thread attributes object |
pthread_attr_setscope() | Changes the contention-scope attribute of the specified thread attributes object |
pthread_attr_setstackaddr() | Changes the stackaddr attribute of the specified thread attributes object |
pthread_attr_setstacksize() | Changes the stacksize attribute of the specified thread attributes object |
Thread Cancelation Routines | |
pthread_cancel() | Allows a thread to request that it, or another thread, terminate execution |
pthread_cleanup_pop() | Removes a cleanup handler routine from the top of the "cleanup stack" and optionally executes it |
pthread_cleanup_push() | Establishes a cleanup handler routine to be executed when the thread exits or is canceled while the handler is on the "cleanup stack" |
pthread_setcancelstate() | Sets the calling thread's cancelability state to enable or disable the delivery of cancelation requests |
pthread_setcanceltype() | Sets the calling thread's cancelability type to enable or disable the delivery of cancelation requests |
pthread_testcancel() | Requests delivery of any pending cancelation request to the calling thread |
Thread Priority, Concurrency, and Scheduling Routines | |
pthread_getconcurrency() | Obtains the current concurrency level parameter for the process |
pthread_getschedparam() | Obtains the current scheduling policy and scheduling parameters of a thread |
pthread_setconcurrency() | Changes the current concurrency level parameter for the process |
pthread_setschedparam() | Changes the current scheduling policy and scheduling parameters of a thread |
Thread-Specific Data Routines | |
pthread_getspecific() | Obtains the thread-specific data value associated with the specified key |
pthread_key_create() | Generates a unique thread-specific data key for the calling thread |
pthread_key_delete() | Deletes a thread-specific data key |
pthread_setspecific() | Changes the thread-specific data value associated with the specified key for the calling thread |
Mutex Routines | |
pthread_mutex_destroy() | Destroys a mutex |
pthread_mutex_init() | Initializes a mutex with attributes specified by the attributes argument |
pthread_mutex_lock() | Locks an unlocked mutex; if locked, the caller waits for the mutex to become available before locking it |
pthread_mutex_trylock() | Attempts to lock a mutex; returns immediately if mutex is already locked |
pthread_mutex_unlock() | Unlocks a mutex locked by the calling thread |
Mutex Attributes Object Routines | |
pthread_mutexattr_destroy() | Destroys a mutex attributes object |
pthread_mutexattr_getpshared() | Obtains the process-shared attribute from the specified mutex attributes object |
pthread_mutexattr_gettype() | Obtains the mutex type attribute from the specified mutex attributes object |
pthread_mutexattr_init() | Initializes a mutex attributes object |
pthread_mutexattr_setpshared() | Changes the process-shared attribute in the specified mutex attributes object |
pthread_mutexattr_settype() | Changes the mutex type attribute in the specified mutex attributes object |
Condition Variable Routines | |
pthread_cond_broadcast() | Wakes all threads currently waiting on a condition variable |
pthread_cond_destroy() | Destroys a condition variable |
pthread_cond_init() | Initializes a condition variable |
pthread_cond_signal() | Wakes at least one thread that is waiting on a condition variable |
pthread_cond_timedwait() | Causes a thread to wait a specified period of time for a condition variable to be signaled or broadcast |
pthread_cond_wait() | Causes a thread to wait for a condition variable to be signaled or broadcast |
Condition Variable Attributes Object Routines | |
pthread_condattr_destroy() | Destroys a condition variable attributes object |
pthread_condattr_getpshared() | Obtains the process-shared attribute from the specified condition variable attributes object |
pthread_condattr_init() | Initializes a condition variable attributes object |
pthread_condattr_setpshared() | Changes the process-shared attribute in the specified condition variable attributes object |
Read-Write Lock Routines | |
pthread_rwlock_destroy() | Destroys a read-write lock object |
pthread_rwlock_init() | Initializes a read-write lock object |
pthread_rwlock_rdlock() | Acquires a read-write lock for read access; if locked, the caller waits for the lock to become available before locking it |
pthread_rwlock_tryrdlock() | Acquires a read-write lock for read access without waiting |
pthread_rwlock_trywrlock() | Acquires a a read-write lock for write access without waiting |
pthread_rwlock_unlock() | Releases a read-write lock previously acquired by the calling thread |
pthread_rwlock_wrlock() | Acquires a read-write lock for write access; if locked, the caller waits for the lock to become available before locking it |
Read-Write Lock Attributes Object Routines | |
pthread_rwlockattr_destroy() | Destroys a read-write lock attributes object |
pthread_rwlockattr_getpshared() | Obtains the process-shared attribute from the specified read-write lock attributes object |
pthread_rwlockattr_init() | Initializes a read-write lock attributes object |
pthread_rwlockattr_setpshared() | Changes the process-shared attribute in the specified read-write lock attributes object |
Nonportable Extensions | |
pthread_delay_np() | Pauses the calling thread's execution for the specified time interval |
pthread_get_expiration_np() | Calculates a timeout for a timed condition variable wait |
pthread_getsequence_np() | Gets a small integer specific to the calling thread |
pthread_attr_getstackaddr_np() | Obtains the address and size of the specified thread attributes object |
pthread_attr_setstackaddr_np() | Sets the address and size of the specified thread attributes object |
pthread_lock_global_np() | Locks the global mutex |
pthread_unlock_global_np() | Unlocks the global mutex |
pthread_cond_signal_int_np() | Requests condition variable signal from software interrupt routine |
pthread_cond_sig_preempt_int_np() | Wakes one thread that is waiting on the specified condition variable; called from software interrupt routine |
pthread_attr_getname_np()
pthread_attr_setname_np() pthread_cond_getname_np() pthread_cond_setname_np() pthread_getname_np() pthread_key_getname_np() pthread_key_setname_np() pthread_mutex_getname_np() pthread_mutex_setname_np() pthread_rwlock_getname_np() pthread_rwlock_setname_np() pthread_setname_np() |
Gets/sets name associated with specific objects for debugging |
pthread_exc_get_status_np()
pthread_exc_matches_np() pthread_exc_report_np() pthread_exc_set_status_np() |
Exception object routines (some are macros) |
pthread_yield_np() | Notifies the scheduler that the current thread is willing to release its processor to other threads of the same or higher priority (alias for sched_yield() ) |
Related Standard Routines | |
sched_get_priority_max() | Returns the maximum priority for the specified scheduling policy |
sched_get_priority_min() | Returns the minimum priority for the specified scheduling policy |
sched_yield() | Notifies the scheduler that the calling thread is willing to release its processor to other threads of the same or higher priority |
sigwait() | Suspends a calling thread until a signal arrives |
Previous | Next | Contents | Index |