HELPLIB.HLB  —  DCE  DCE_THREADS
  DESCRIPTION

  DECthreads, HP's multithreading run-time library, provides a set of
  interfaces for building multithreaded programs. One of these interfaces
  provides routines (with the prefix pthread_) that implement the IEEE Std
  1003.1c-1995, POSIX System Application Program Interface, also known as
  POSIX Standard 1003.1c or POSIX.1c.  Note that POSIX Standard 1003.1c now
  supersedes the POSIX draft standard 1003.4a.

  A thread is a single, sequential flow of control within a program.  Within
  a single thread, there is a single point of execution.  Most traditional
  programs consist of a single thread.

  Using DECthreads, a programmer can create more than one threads within a
  program.  Threads execute concurrently, and, within a multithreaded pro-
  gram, there are at any time multiple points of execution.  The threads in a
  given process execute within (and share) a single address space.  There-
  fore, threads read and write the same memory locations.  Synchronization
  elements such as mutexes and condition variables ensure that the shared
  memory is accessed correctly.  DECthreads provides routines that allow you
  to create and use these synchronization elements.  Mutexes and condition
  variables are discussed in the Guide to DECthreads.

  Users of previous versions of DECthreads should be aware that applications
  consistent with the P1003.4a/D4 interface require significant modifications
  to be upgraded to the DECthreads pthread (POSIX.1c) interface.  See the
  discussion in the Guide to DECthreads.

  Routine names ending with the _np suffix denote that the routine is "not
  portable."  That is, such a routine might not be available in other vendor
  implementations of POSIX 1003.1c.

  Each C module that utilizes DECthreads exceptions must include the
  pthread_exception.h header file. The Guide to DECthreads describes the use
  of DECthreads exceptions.

  The Guide to DECthreads describes important considerations for threaded
  application development, particularly for the OpenVMS operating system.

  Threads are packaged with the operating system.

1  –  Thread Intro

  NAME

      intro - Introduction to DCE Threads

  DESCRIPTION

  DCE Threads are a set of routines that you can call to create a multi-
  threaded program.  Multithreading is used to improve the performance
  of a program.  Routines implemented by DCE Threads that are not speci-
  fied by Draft 4 of the POSIX 1003.4a standard are indicated by an _np
  suffix on the name.  These routines are not portable.

  The pthread interface routines are grouped in the following functional
  categories:

     +  General threads routines

     +  Thread attributes object routines

     +  Thread cancelation routines

     +  Thread priority, concurrency, and scheduling routines

     +  Thread-specific data routines

     +  Mutex routines

     +  Mutex attributes object routines

     +  Condition variable routines

     +  Condition variable attribute object routines

  DECthreads also provides routines that implement nonportable extensions
  to the POSIX 1003.1c standard.  These routines are grouped into these
  functional categories:

     +  Thread execution routines

     +  Thread attributes routines

     +  DECthreads global mutex routines

     +  Mutex attributes routines

     +  Condition variable routines

     +  DECthreads exception object routines

1.1  –  General Threads Routines

   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_once            Calls an initialization routine to be
                           executed only once.

   pthread_self            Obtains the identifier of the current thread.

1.2  –  Thread Attributes Object Routines

   pthread_attr_destroy    Destroys a thread attributes object.

   pthread_attr_getdetachstate
                           Obtains the detachstate attribute from 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
                           from the specified thread attributes object.

   pthread_attr_getschedparam
                           Obtains the scheduling parameters for an
                           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 in 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 attri-
                           butes object.

   pthread_attr_setschedpolicy
                           Changes the scheduling policy attribute
                           of the specified thread attributes object.

   pthread_attr_setstackaddr
                           Changes the stackaddr attribute in the
                           specified thread attributes object.

   pthread_attr_setstacksize
                           Changes the stacksize attribute in the
                           specified thread attributes object.

1.3  –  Thread Cancellation 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.

   pthread_setcancelstate  Sets the current thread's cancelability
                           state.

   pthread_setcanceltype   Sets the current thread's cancelability
                           type.

   pthread_testcancel      Requests delivery of any pending
                           cancelation request to the current thread.

1.4  –  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_getsequence_np  Obtains a thread sequence number.

   pthread_setconcurrency  Changes the current concurrency level
                           parameter for the process.

   pthread_setschedparam   Changes the current scheduling policy
                           and scheduling parameters of a thread.

1.5  –  Thread Specific Data Routines

   pthread_getspecific     Obtains the thread-specific data
                           associated with the specified key.

   pthread_key_create      Generates a unique thread-specific data key.

   pthread_setspecific     Sets the thread-specific data value
                           associated with the specified key for the
                           current thread.

   pthread_key_delete      Deletes a thread-specific data key.

1.6  –  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.

   pthread_mutex_trylock   Attempts to lock a mutex; returns
                           immediately if mutex is already locked.

   pthread_mutex_unlock    Unlocks a locked mutex.

1.7  –  Mutex Attributes Object Routines

   pthread_mutexattr_init  Initializes a mutex attributes object.

   pthread_mutexattr_destroy
                           Destroys a mutex attributes object.

   pthread_mutexattr_gettype
                           Obtains the mutex type attribute of a
                           mutex attributes object.

   pthread_mutexattr_settype
                           Changes the mutex type attribute of a
                           mutex attributes object.

1.8  –  Condition Variable Routines

   pthread_cond_broadcast  Wakes all threads 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 for a specified
                           period of time for a condition variable
                           to be signaled or broadcasted.

   pthread_cond_wait       Causes a thread to wait for a condition
                           variable to be signaled or broadcasted.

1.9  –  Condition Variable Attributes Object Routines

   pthread_condattr_destroy
 			  Destroys a condition variable attributes
                           object.

   pthread_condattr_init   Initializes a condition variable attributes
                           object.

1.10  –  Non Portable Extensions

  DECthreads also provides routines that implement nonportable extensions
  to the POSIX 1003.1c standard.  These routines are grouped into these
  functional categories:

1.10.1  –  Thread Execution Routines

   pthread_delay_np        Causes a thread to delay execution.

   pthread_get_expiration_np
                           Obtains a value representing a desired
                           expiration time.

   pthread_getsequence_np  Obtains the thread sequence number.

1.10.2  –  Thread Attributes Routines

   pthread_attr_getguardsize_np
                           Obtains the guardsize attribute of the
                           specified thread attributes object.

   pthread_attr_setguardsize_np
                           Changes the guardsize attribute of the
                           specified thread attributes object.

1.10.3  –  DECthreads Global Mutex Routines

   pthread_lock_global_np  Locks the DECthreads global mutex if it
                           is unlocked.

   pthread_unlock_global_np
                           Unlocks the DECthreads lobal mutex if
                           it is locked.

1.10.4  –  Mutex Attributes Routines

   pthread_mutexattr_gettype_np
                           Obtains the mutex type attribute of a
                           mutex attributes object.

   pthread_mutexattr_settype_np
                           Changes the mutex type attribute of a
                           mutex attributes object.

1.10.5  –  Condition Variable Routines

   pthread_cond_signal_int_np
                           Wakes one thread that is waiting on a
                           condition variable (called from interrupt
                           level only).

1.10.6  –  DECthreads Exception Object Routines

   pthread_exc_get_status_np
                           Obtains a system-defined error status
                           from a DECthreads status exception object.

   pthread_exc_matches_np  Determines whether two DECthreads exception
                           objects are identical.

   pthread_exc_report_np   Produces a message that reports what a
                           specified DECthreads status exception
                           object represents.

   pthread_exc_set_status_np
                           Imports a system-defined error status
                           into a DECthreads address exception object.

2  –  Application Routines

2.1  –  exceptions

 NAME

      exceptions - Exception handling in DCE Threads

 DESCRIPTION

 DCE Threads provides the following two ways to obtain information about
 the status of a threads routine:

        o    The routine returns a status value to the thread.

        o    The routine raises an exception.

 Before you write a multithreaded program, you must choose  only  one  of
 the  preceding two methods of receiving status. These two methods cannot
 be used together in the same code module.

 The POSIX P1003.4a (pthreads) draft standard specifies  that  errors  be
 reported  to  the  thread  by  setting the external variable errno to an
 error code and returning a function value of -1.  The threads reference
 pages document this status value-returning  interface.  However,  an
 alternative  to  status  values  is provided by DCE Threads in the
 exception-returning interface.

 Access to exceptions from the C language is defined by the macros in the
 exc_handling.h file. The exc_handling.h header file is included automat-
 ically when you include pthread_exc.h.

 To use the exception-returning interface, replace

    #include <pthread.h>

 with the following include statement:

    #include <pthread_exc.h>

 The following example shows the syntax for handling exceptions:

     TRY
         try_block
     [CATCH (exception_name)
         handler_block]...
     [CATCH_ALL
         handler_block]
     ENDTRY

2.2  –  pthread_attr_create

 NAME

    pthread_attr_create - Creates a thread attributes object

 SYNOPSIS

     #include <pthread.h>

     int pthread_attr_create (pthread_attr_t *attr);

 PARAMETERS

     attr                Thread attributes object created.

 DESCRIPTION

 The pthread_attr_create() routine creates a thread attributes object
 that is used to specify the attributes of threads when they are created.
 The attributes object created by this routine is only used in calls to
 pthread_create().

 The individual attributes (internal fields) of the attributes object are
 set to default values. (The default values of each attribute are dis-
 cussed in the descriptions of the following services.) Use the following
 routines to change the individual attributes:

        o    pthread_attr_setinheritsched()

        o    pthread_attr_setprio()

        o    pthread_attr_setsched()

        o    pthread_attr_setstacksize()

 When an attributes object is used to create a thread, the values of  the
 individual  attributes  determine the characteristics of the new object.
 Attributes objects perform in a manner similar to additional parameters.
 Changing  individual  attributes  does  not affect any threads that were
 previously created using the attributes object.

 RETURN VALUES

      If the function fails, -1 is returned and errno may be set to one
      of the following values:

            Return   Error      Description
            ___________________________________________________________
               0                Successful completion.

              -1     [ENOMEM]   Insufficient memory exists to create
                                the thread attributes object.

              -1     [EINVAL]   The value specified by attr is invalid.

 RELATED INFORMATION

      FUNCTIONS: pthread_attr_delete
                 pthread_attr_setinheritsched
                 pthread_attr_setprio
                 pthread_attr_setsched
                 pthread_attr_setstacksize
                 pthread_create

2.3  –  pthread_attr_delete

 NAME

    pthread_attr_delete - Deletes a thread attributes object

 SYNOPSIS

     #include <pthread.h>

     int pthread_attr_delete(pthread_attr_t *attr);

 PARAMETERS

     attr                Thread attributes object deleted.

 DESCRIPTION

 The pthread_attr_delete() routine deletes a thread attributes object and
 gives permission to reclaim storage for the thread attributes object.
 Threads that were created using this thread attributes object are not
 affected by the deletion of the thread attributes object.

 The results of calling this routine are unpredictable if the value
 specified by the attr parameter refers to a thread attributes object
 that does not exist.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

            Return   Error      Description
            ___________________________________________________________
               0                Successful completion.

              -1     [EINVAL]   The value specified by attr is invalid.

 RELATED INFORMATION

      FUNCTIONS: pthread_attr_create

2.4  –  pthread_attr_getinheritsched

 NAME

    pthread_attr_getinheritsched - Obtains the inherit
 		                  scheduling attribute

 SYNOPSIS

     #include <pthread.h>

     int pthread_attr_getinheritsched(pthread_attr_t attr);

 PARAMETERS

     attr             Thread attributes object whose inherit scheduling
                      attribute is obtained.

 DESCRIPTION

 The pthread_attr_getinheritsched() routine obtains the value of the
 inherit scheduling attribute in the specified thread attributes object.
 The inherit scheduling attribute specifies whether threads created using
 the attributes object inherit the scheduling attributes of the creating
 thread, or use the scheduling attributes stored in the attributes object
 that is passed to pthread_create().

 The default value of the inherit scheduling attribute is
 PTHREAD_INHERIT_SCHED.

 RETURN VALUES

 On successful completion, this routine returns the inherit scheduling
 attribute value.

 If the function fails, errno may be set to one of the following values:

    Return                    Error      Description
     ________________________________________________________________
    Inherit scheduling                   Successful completion.
    attribute

    -1                        [EINVAL]   The value specified by attr
                                         is invalid.

 RELATED INFORMATION

      FUNCTIONS:  pthread_attr_create
                  pthread_attr_setinheritsched
                  pthread_create

2.5  –  pthread_attr_getprio

 NAME

    pthread_attr_getprio - Obtains the scheduling priority attribute

 SYNOPSIS

     #include <pthread.h>

     int pthread_attr_getprio(pthread_attr_t attr);

 PARAMETERS

     attr             Thread attributes object whose priority attribute
                       is obtained.

 DESCRIPTION

 The pthread_attr_getprio() routine obtains the value of the scheduling
 priority of threads created using the thread attributes object specified
 by the attr parameter.

 RETURN VALUES

 On successful completion, this routine returns the scheduling priority
 attribute value.

 If the function fails, errno may be set to one of the following values:

    Return                     Error      Description
   _________________________________________________________
   Scheduling priority                    Successful completion.
   attribute

   -1                         [EINVAL]   The value specified by attr
                                         is invalid.

 RELATED INFORMATION

      FUNCTIONS:  pthread_attr_create
                  pthread_attr_setprio
                  pthread_create

2.6  –  pthread_attr_getsched

 NAME

    pthread_attr_getsched - Obtains the value of the scheduling
 			   policy attribute

 SYNOPSIS

     #include <pthread.h>

     int pthread_attr_getsched(pthread_attr_t attr);

 PARAMETERS

     attr             Thread attributes object whose scheduling policy
                      attribute is obtained.

 DESCRIPTION

 The pthread_attr_getsched() routine obtains the scheduling policy of
 threads created using the thread attributes object specified by the attr
 parameter. The default value of the scheduling attribute is SCHED_OTHER.

 RETURN VALUES

 On successful completion, this routine returns the value of the
 scheduling policy attribute.

 If the function fails, errno may be set to one of the following values:

    Return                   Error      Description
    ________________________________________________________________
    Scheduling policy                   Successful completion.
    attribute

    -1                       [EINVAL]   The value specified by attr
                                        is invalid.

 RELATED INFORMATION

      FUNCTIONS:  pthread_attr_create
                  pthread_attr_setsched
                  pthread_create

2.7  –  pthread_attr_getstacksize

 NAME

    pthread_attr_getstacksize - Obtains the value of the
 			       stacksize attribute

 SYNOPSIS

     #include <pthread.h>

     long pthread_attr_getstacksize(pthread_attr_t attr);

 PARAMETERS

     attr              Thread attributes object whose stacksize attribute
                       is obtained.

 DESCRIPTION

 The pthread_attr_getstacksize() routine obtains the minimum size (in
 bytes) of the stack for a thread created using the thread attributes
 object specified by the attr parameter.

 RETURN VALUES

 On successful completion, this routine returns the stacksize attribute
 value.

 If the function fails, errno may be set to one of the following values:

    Return                Error      Description
    __________________________________________________________
    Stacksize attribute              Successful completion.

    -1                  [EINVAL]     The value specified by
                                     attr is invalid.

 RELATED INFORMATION

      FUNCTIONS:  pthread_attr_create
                  pthread_attr_setstacksize
                  pthread_create

2.8  –  pthread_attr_setinheritsched

 NAME

    pthread_attr_setinheritsched - Changes the inherit scheduling
 				  attribute

 SYNOPSIS

     #include <pthread.h>

     int pthread_attr_setinheritsched( pthread_attr_t attr,
                                        int inherit );

 PARAMETERS

     attr             Thread attributes object to be modified.

     inherit          New value for the inherit scheduling attribute.
                      Valid values are as follows:

                      PTHREAD_INHERIT_SCHED
                              This is the default value. The created
                              thread inherits the current priority
                              and scheduling policy of the thread
                              calling pthread_create().

                       PTHREAD_DEFAULT_SCHED
                              The created thread starts execution with
                              the priority and scheduling policy stored
                              in the thread attributes object.

 DESCRIPTION

 The pthread_attr_setinheritsched() routine changes the inherit schedul-
 -ing attribute of thread creation.  The inherit scheduling attribute spe
 cifies whether threads created using the specified thread attributes obj
 ect inherit the scheduling attributes of the creating thread, or use the
 scheduling attributes stored in the thread attributes object that is
 passed to pthread_create().

 The first thread in an application that is not created by an explicit
 call to pthread_create() has a scheduling policy of SCHED_OTHER.  (See
 the pthread_attr_setprio() and pthread_attr_setsched() routines for more
 information on valid priority values and valid scheduling policy values,
 respectively.)

 Inheriting scheduling attributes (instead of using the scheduling attri-
 butes stored in the attributes object) is useful when a thread is creat-
 ing several helper threads-threads that are intended to work closely
 with the creating thread to cooperatively solve the same problem. For
 example, inherited scheduling attributes ensure that helper threads
 created in a sort routine execute with the same priority as the calling
 thread.

 RETURN VALUES

 If the function fails, -1 is returned, and errno may be set to one of
 the following values:

    Return   Error      Description
    ___________________________________________________________
    0                   Successful completion.

    -1       [EINVAL]   The value specified by attr is invalid.

    -1       [EINVAL]   The value specified by inherit is invalid.

 RELATED INFORMATION

      FUNCTIONS:  pthread_attr_create
                  pthread_attr_getinheritsched
                  pthread_attr_setprio
                  pthread_attr_setsched
                  pthread_create

2.9  –  pthread_attr_setprio

 NAME

    pthread_attr_setprio - Changes the scheduling priority attribute of
                           thread creation

 SYNOPSIS

     #include <pthread.h>

     int pthread_attr_setprio( pthread_attr_t *attr,
                                int priority );

 PARAMETERS

     attr                Thread attributes object modified.

     priority            New value for the priority attribute.  The
                         priority attribute depends on scheduling
                         policy. Valid values fall within one of the
                         following ranges:

                         o    PRI_OTHER_MIN <= priority <= PRI_OTHER_MAX
                              (use with the SCHED_OTHER policy)

                         o    PRI_FIFO_MIN <= priority <= PRI_FIFO_MAX
                              (use with the SCHED_FIFO policy)

                         o    PRI_RR_MIN <= priority <= PRI_RR_MAX
                              (use with the SCHED_RR policy)

                         o    PRI_FG_MIN_NP <= priority <= PRI_FG_MAX_NP
                              (use with the SCHED_FG_NP policy)

                         o    PRI_BG_MIN_NP <= priority <= PRI_BG_MAX_NP
                              (use with the SCHED_BG_NP policy)

 The  default  priority  is  the  midpoint  between   PRI_OTHER_MIN   and
 PRI_OTHER_MAX.  To  specify  a  minimum  or  maximum  priority,  use the
 appropriate  symbol;  for  example,  PRI_FIFO_MIN  or  PRI_FIFO_MAX.  To
 specify  a  value  between  the  minimum and maximum, use an appropriate
 arithmetic expression.   For  example,  to  specify  a  priority  midway
 between  the  minimum and maximum for the Round Robin scheduling policy,
 specify the following concept using your programming language's syntax:
      pri_rr_mid = (PRI_RR_MIN + PRI_RR_MAX)/2

 If your expression results in a value outside the range  of  minimum  to
 maximum, an error results when you attempt to use it.

 DESCRIPTION

 The  pthread_attr_setprio()  routine  sets  the  execution  priority  of
 threads  that  are  created using the attributes object specified by the
 attr parameter.

 By default, a created thread inherits the priority of the thread calling
 pthread_create().  To  specify a priority using this routine, scheduling
 inheritance must be disabled at the time the thread is created.   Before
 calling      this      routine      and      pthread_create(),      call
 pthread_attr_setinheritsched()      and      specify      the      value
 PTHREAD_DEFAULT_SCHED for the inherit parameter.

 An application specifies priority only to express the urgency of execut-
 ing  the  thread relative to other threads. Priority is not used to con-
 trol mutual exclusion when accessing shared data.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    ___________________________________________________________
    0                   Successful completion.

    -1       [EINVAL]   The value specified by attr is invalid.

    -1       [ERANGE]   One or more parameters supplied have an
                        invalid value.
    -1       [EPERM]    The caller does not have the appropriate
                        privileges to set the priority of the
                        specified thread.

 RELATED INFORMATION

     FUNCTIONS:  pthread_attr_create
                 pthread_attr_getprio
                 pthread_attr_setinheritsched
                 pthread_create

2.10  –  pthread_attr_setsched

 NAME

    pthread_attr_setsched - Changes the scheduling policy attribute of
                             thread creation

 SYNOPSIS

     #include <pthread.h>

     int pthread_attr_setsched( pthread_attr_t *attr
                                int *scheduler );

 PARAMETERS

     attr                Thread attributes object modified.

     scheduler           New value for the scheduling policy attribute.
                         Valid values are as follows:

                         SCHED_FIFO (First In, First Out)
                              The highest-priority thread runs until it
                              blocks. If there is more than one thread
                              with the same priority, and that priority
                              is the highest among other threads, the
                              first thread to begin running continues
                              until it blocks.

                         SCHED_RR (Round Robin)
                              The highest-priority thread runs until it
                              blocks; however, threads of equal priority,
                              if that priority is the highest among other
                              threads, are timesliced.  Timeslicing is a
                              process in which threads alternate using
                              available processors.

                         SCHED_OTHER (Default)
                              All threads are timesliced. SCHED_OTHER
                              ensures that all threads, regardless of
                              priority, receive some scheduling so that
                              no thread is completely denied execution
                              time. (However, SCHED_OTHER threads can be
                              denied execution time by SCHED_FIFO or
                              SCHED_RR threads.)

                         SCHED_FG_NP (Foreground)
                              Same as SCHED_OTHER.  Threads are time-
                              sliced and priorities can be modified
                              dynamically by the scheduler to ensure
                              fairness.

                         SCHED_BG_NP (Background)
                              Ensures that all threads, regardless of
                              priority, receive some scheduling. However,
                              SCHED_BG_NP can be denied execution by
                              SCHED_FIFO or SCHED_RR threads.

 DESCRIPTION

 The pthread_attr_setsched() routine sets the scheduling policy of a
 thread that is created using the attributes object specified by the attr
 parameter. The default value of the scheduling attribute is SCHED_OTHER.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    ___________________________________________________________
    0                   Successful completion.

    -1     [EINVAL]     The value specified by attr is invalid.

    -1     [EINVAL]     The value specified by scheduler is invalid.

    -1     [EPERM]      The caller does not have the appropriate
                        privileges to set the priority of the
                        specified thread.

 RELATED INFORMATION

      FUNCTIONS: pthread_attr_create
                 pthread_attr_getsched
                 pthread_attr_setinheritsched
                 pthread_create

2.11  –  pthread_attr_setstacksize

 NAME

    pthread_attr_setstacksize - Changes the stacksize attribute of
 			       thread creation

 SYNOPSIS

     #include <pthread.h>

     int pthread_attr_setstacksize( pthread_attr_t *attr,
                                    long stacksize );

 PARAMETERS

     attr                Thread attributes object modified.

     stacksize           New value for the stacksize attribute.  The
                         stacksize parameter specifies the minimum size
                         (in bytes) of the stack needed for a thread.

 DESCRIPTION

 The pthread_attr_setstacksize() routine sets the minimum size (in bytes)
 of the stack needed for a thread created using the attributes object
 specified by the attr parameter. Use this routine to adjust the size of
 the writable area of the stack. The default value of the stacksize
 attribute is machine specific.

 A thread's stack is fixed at the time of thread creation. Only the main
 or initial thread can dynamically extend its stack.

 Most compilers do not check for stack overflow.  Ensure that your thread
 stack is large enough for anything that you call from the thread.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    ___________________________________________________________
    0                   Successful completion.

    -1     [EINVAL]     The value specified by attr is invalid.

    -1     [EINVAL]     The value specified by stacksize is invalid.

 RELATED INFORMATION

      FUNCTIONS: pthread_attr_create
                 pthread_attr_getstacksize
                 pthread_create

2.12  –  pthread_cancel

 NAME

    pthread_cancel - Allows a thread to request that it or another
 		    thread terminate execution

 SYNOPSIS

     #include <pthread.h>

     int pthread_cancel(pthread_t thread);

 PARAMETERS

     thread                Thread that receives a cancel request.

 DESCRIPTION

 The pthread_cancel() routine sends a cancel to the specified thread. A
 cancel is a mechanism by which a calling thread informs either itself or
 the called thread to terminate as quickly as possible. Issuing a cancel
 does not guarantee that the canceled thread receives or handles the can-
 cel. The canceled thread can delay processing the cancel after receiving
 it. For instance, if a cancel arrives during an important operation, the
 canceled thread can continue if what it is doing cannot be interrupted
 at the point where the cancel is requested.

 Because of communications delays, the calling thread can only rely on
 the fact that a cancel eventually becomes pending in the designated
 thread (provided that the thread does not terminate beforehand). Furth-
 ermore, the calling thread has no guarantee that a pending cancel is to
 be delivered because delivery is controlled by the designated thread.

 Termination processing when a cancel is delivered to a thread is similar
 to pthread_exit(). Outstanding cleanup routines are executed in the con-
 text of the target thread, and a status of -1 is made available to any
 threads joining with the target thread.

 This routine is preferred in implementing Ada's abort statement and any
 other language (or software-defined construct) for requesting thread
 cancellation.

 The results of this routine are unpredictable if the value specified in
 thread refers to a thread that does not currently exist.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    ____________________________________________________
    0                   Successful completion.

    -1      [EINVAL]    The specified thread is invalid.

    -1      [ERSCH]     The specified thread does not refer
                        to a currently existing thread.

 RELATED INFORMATION

      FUNCTIONS: pthread_exit
                 pthread_join
                 pthread_setasynccancel
                 pthread_setcancel
                 pthread_testcancel

2.13  –  pthread_cleanup_pop

 NAME

    pthread_cleanup_pop - Removes the cleanup handler at the top of the
                          cleanup stack and optionally executes it

 SYNOPSIS

     #include <pthread.h>

     void pthread_cleanup_pop(int execute);

 PARAMETERS

     execute              Integer that specifies whether the cleanup
                          routine that is popped should be executed or
                          just discarded.  If the value is nonzero, the
                          cleanup routine is executed.

 DESCRIPTION

 The pthread_cleanup_pop()  routine removes the routine specified in
 pthread_cleanup_push() from the top of the calling thread's cleanup
 stack and executes it if the value specified in execute is nonzero.

 This routine and pthread_cleanup_push() are implemented as macros and
 must be displayed as statements and in pairs within the same lexical
 scope.  You can think of the pthread_cleanup_push() macro as expanding
 to a string whose first character is a { (left brace) and
 pthread_cleanup_pop as expanding to a string containing the correspond-
 ing } (right brace).

 RETURN VALUES

 This routine must be used as a statement.

 RELATED INFORMATION

      FUNCTIONS: pthread_cleanup_push

2.14  –  pthread_cleanup_push

 NAME

    pthread_cleanup_push - Establishes a cleanup handler

 SYNOPSIS

     #include <pthread.h>

     void pthread_cleanup_push( void routine,
                                 pthread_addr_t arg );

 PARAMETERS

     routine              Routine executed as the cleanup handler.

     arg                  Parameter executed with the cleanup routine.

 DESCRIPTION

 The pthread_cleanup_push() routine pushes the specified routine onto the
 calling thread's cleanup stack. The cleanup routine is popped from the
 stack and executed with the arg parameter when any of the following
 actions occur:

     o   The thread calls pthread_exit().

     o   The thread is canceled.

     o   The thread calls pthread_cleanup_pop() and specifies a nonzero
         value for the execute parameter.

 This routine and pthread_cleanup_pop() are  implemented  as  macros  and
 must  be  displayed  as  statements and in pairs within the same lexical
 scope.  You can think of the pthread_cleanup_push() macro  as  expanding
 to   a   string   whose   first  character  is  a  {  (left  brace)  and
 pthread_cleanup_pop()  as  expanding  to   a   string   containing   the
 corresponding } (right brace).

 RETURN VALUES

 This routine must be used as a statement.

 RELATED INFORMATION

     FUNCTIONS:  pthread_cancel
                 pthread_cleanup_pop
                 pthread_exit
                 pthread_testcancel

2.15  –  pthread_condattr_create

 NAME

    pthread_condattr_create - Creates a condition variable attributes
                              object

 SYNOPSIS

     #include <pthread.h>

     int pthread_condattr_create(pthread_condattr_t *attr);

 PARAMETERS

     attr             Condition variable attributes object that is
                      created.

 DESCRIPTION

 The pthread_condattr_create() routine creates a condition variable
 attributes object that is used to specify the attributes of condition
 variables when they are created. The condition variable attributes
 object is initialized with the default value for all of the attributes
 defined by a given implementation.

 When a condition variable attributes object is used to create a condi-
 tion variable, the values of the individual attributes determine the
 characteristics of the new object. Attributes objects act like addi-
 tional parameters to object creation. Changing individual attributes
 does not affect objects that were previously created using the attri-
 butes object.

 RETURN VALUES

 The created condition variable attributes object is returned to the attr
 parameter.

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    ___________________________________________________________
    0                   Successful completion.

    -1     [EINVAL]     The value specified by attr is invalid.

    -1     [ENOMEM]     Insufficient memory exists to create
                        the condition variable attributes object.

 RELATED INFORMATION

     FUNCTIONS: pthread_condattr_delete
                 pthread_cond_init

2.16  –  pthread_condattr_delete

 NAME

    pthread_condattr_delete - Deletes a condition variable attributes
                               object

 SYNOPSIS

     #include <pthread.h>

     int pthread_condattr_delete(pthread_condattr_t *attr);

 PARAMETERS

     attr             Condition variable attributes object deleted.

 DESCRIPTION

 The pthread_condattr_delete()  routine deletes a condition variable
 attributes object. Call this routine when a condition variable attri-
 butes object created by pthread_condattr_create() is no longer refer-
 enced.

 This routine gives permission to reclaim storage for the condition vari-
 able attributes object. Condition variables that are created using this
 attributes object are not affected by the deletion of the condition
 variable attributes object.

 The results of calling this routine are unpredictable if the handle
 specified by the attr parameter refers to an attributes object that does
 not exist.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    ___________________________________________________________
    0                   Successful completion.

    -1      [EINVAL]    The value specified by attr is invalid.

 RELATED INFORMATION

     FUNCTIONS: pthread_condattr_create

2.17  –  pthread_cond_broadcast

 NAME

     pthread_cond_broadcast - Wakes all threads that are waiting on
                              a condition variable

 SYNOPSIS

     #include <pthread.h>

     int pthread_cond_broadcast(pthread_cond_t *cond);

 PARAMETERS

     cond                Condition variable broadcast.

 DESCRIPTION

 The pthread_cond_broadcast() routine wakes all threads waiting on a con-
 dition variable. Calling this routine implies that data guarded by the
 associated mutex has changed so that it might be possible for one or
 more waiting threads to proceed. If any one waiting thread might be able
 to proceed, call pthread_cond_signal().

 Call this routine when the associated mutex is either locked or
 unlocked.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    ___________________________________________________________
    0                   Successful completion.

    -1      [EINVAL]    The value specified by cond is invalid.

 RELATED INFORMATION

     FUNCTIONS:  pthread_cond_destroy
                  pthread_cond_init
                  pthread_cond_signal
                  pthread_cond_timedwait
                  pthread_cond_wait

2.18  –  pthread_cond_destroy

 NAME

    pthread_cond_destroy - Deletes a condition variable

 SYNOPSIS

     #include <pthread.h>

     int pthread_cond_destroy(pthread_cond_t *cond);

 PARAMETERS

     cond                Condition variable deleted.

 DESCRIPTION

 The pthread_cond_destroy() routine deletes a condition variable. Call
 this routine when a condition variable is no longer referenced. The
 effect of calling this routine is to give permission to reclaim storage
 for the condition variable.

 The results of this routine are unpredictable if the condition variable
 specified in cond does not exist.

 The results of this routine are also unpredictable if there are threads
 waiting for the specified condition variable to be signaled or broadcast
 when it is deleted.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    ___________________________________________________________
     0                  Successful completion.

    -1      [EINVAL]    The value specified by cond is invalid.

    -1      [EBUSY]     A thread is currently executing a
                        pthread_cond_timedwait() routine or
                        pthread_cond_wait() on the condition
                        variable specified in cond.

 RELATED INFORMATION

      FUNCTIONS:  pthread_cond_broadcast
                  pthread_cond_init
                  pthread_cond_signal
                  pthread_cond_timedwait
                  pthread_cond_wait

2.19  –  pthread_cond_init

 NAME

    pthread_cond_init - Creates a condition variable

 SYNOPSIS

     #include <pthread.h>

     int pthread_cond_init( pthread_cond_t *cond,
                             pthread_condattr_t attr );

 PARAMETERS

     cond             Condition variable that is created.

     attr             Condition variable attributes object that
                      defines the characteristics of the condition
                      variable created. If you specify
                      pthread_condattr_default, default attributes
                      are used.

 DESCRIPTION

 The pthread_cond_init()  routine creates and initializes a condition
 variable. A condition variable is a synchronization object used in con-
 junction with a mutex. A mutex controls access to shared data; a condi-
 tion variable allows threads to wait for that data to enter a defined
 state. The state is defined by a Boolean expression called a predicate.

 A condition variable is signaled or broadcast to indicate that a predi-
 cate might have become true. The broadcast operation indicates that all
 waiting threads need to resume and reevaluate the predicate. The signal
 operation is used when any one waiting thread can continue.

 If a thread that holds a mutex determines that the shared data is not in
 the correct state for it to proceed (the associated predicate is not
 true), it waits on a condition variable associated with the desired
 state. Waiting on the condition variable automatically releases the
 mutex so that other threads can modify or examine the shared data. When
 a thread modifies the state of the shared data so that a predicate might
 be true, it signals or broadcasts on the appropriate condition variable
 so that threads waiting for that predicate can continue.

 It is important that all threads waiting on a particular condition vari-
 able at any time hold the same mutex. If they do not, the behavior of
 the wait operation is unpredictable (an implementation can use the mutex
 to control internal access to the condition variable object). However,
 it is legal for a client to store condition variables and mutexes and
 later reuse them in different combinations. The client must ensure that
 no threads use the condition variable with the old mutex. At any time,
 an arbitrary number of condition variables can be associated with a sin-
 gle mutex, each representing a different predicate of the shared data
 protected by that mutex.

 Condition variables are not owned by a particular thread. Any associated
 storage is not automatically deallocated when the creating thread ter-
 minates.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    __________________________________________________
     0                  Successful completion.

    -1      [EAGAIN]    The system lacks the necessary resources
                        to initialize another condition variable.

    -1      [EINVAL]    Invalid attributes object.

    -1      [ENOMEM]    Insufficient memory exists to initialize
                        the condition variable.

 RELATED INFORMATION

      FUNCTIONS: pthread_cond_broadcast
                 pthread_cond_destroy
                 pthread_cond_signal
                 pthread_cond_timedwait
                 pthread_cond_wait

2.20  –  pthread_cond_signal

 NAME

    pthread_cond_signal - Wakes one thread that is waiting on a
                          condition variable

 SYNOPSIS

     #include <pthread.h>

     int pthread_cond_signal(pthread_cond_t *cond);

 PARAMETERS

     cond             Condition variable signaled.

 DESCRIPTION

 The pthread_cond_signal() routine wakes one thread waiting on a condi-
 tion variable. Calling this routine implies that data guarded by the
 associated mutex has changed so that it is possible for a single waiting
 thread to proceed. Call this routine when any thread waiting on the
 specified condition variable might find its predicate true, but only one
 thread needs to proceed.

 The scheduling policy determines which thread is awakened. For policies
 SCHED_FIFO and SCHED_RR a blocked thread is chosen in priority order.

 Call this routine when the associated mutex is either locked or
 unlocked.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    ___________________________________________________________
     0                  Successful completion.

    -1      [EINVAL]    The value specified by cond is invalid.

    RELATED INFORMATION

      FUNCTIONS:  pthread_cond_broadcast
                  pthread_cond_destroy
                  pthread_cond_init
                  pthread_cond_timedwait
                  pthread_cond_wait

2.21  –  pthread_cond_timedwait

 NAME

    pthread_cond_timedwait - Causes a thread to wait for a condition
                             variable to be signaled or broadcast

 SYNOPSIS

     #include <pthread.h>

     int pthread_cond_timedwait( pthread_cond_t  *cond,
                                 pthread_mutex_t *mutex,
                                 struct timespec *abstime );

 PARAMETERS

     cond              Condition variable waited on.

     mutex             Mutex associated with the condition variable
                       specified in cond.

     abstime           Absolute time at which the wait expires, if the
                       condition has not been signaled or broadcast.
                       (See the pthread_get_expiration_np() routine,
                       which you can use to obtain a value for this
                       parameter.)

 DESCRIPTION

 The pthread_cond_timedwait() routine causes a thread to wait until one
 of the following occurs:

    o  The specified condition variable is signaled or broadcast.

    o  The current system clock time is greater than or equal to the time
       specified by the abstime parameter.

 This routine is identical to pthread_cond_wait() except that this rou-
 tine can return before a condition variable is signaled or broadcast-
 specifically, when a specified time expires.

 If the current time equals or exceeds the expiration time, this  routine
 returns immediately, without causing the current thread to wait.

 Call this routine after you lock the  mutex  specified  in  mutex.   The
 results  of  this  routine  are  unpredictable if this routine is called
 without first locking the mutex.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error       Description
    ___________________________________________________________
     0                   Successful completion.

    -1      [EINVAL]     The value specified by cond, mutex, or
                         abstime is invalid.

    -1      [EAGAIN]     The time specified by abstime expired.

    -1      [EDEADLK]    A deadlock condition is detected.

 RELATED INFORMATION

     FUNCTIONS:  pthread_cond_broadcast
                 pthread_cond_destroy
                 pthread_cond_init
                 pthread_cond_signal
                 pthread_cond_wait
                 pthread_get_expiration_np

2.22  –  pthread_cond_wait

 NAME

    pthread_cond_wait - Causes a thread to wait for a condition
 		       variable to be signaled or broadcast

 SYNOPSIS

     #include <pthread.h>

     int pthread_cond_wait( pthread_cond_t  *cond,
                             pthread_mutex_t *mutex );

 PARAMETERS

     cond                Condition variable waited on.

     mutex               Mutex associated with the condition variable
                         specified in cond.

 DESCRIPTION

 The pthread_cond_wait() routine causes a thread to wait for a condition
 variable to be signaled or broadcast. Each condition corresponds to one
 or more predicates based on shared data. The calling thread waits for
 the data to reach a particular state (for the predicate to become true).

 Call this routine after you have locked the mutex specified in mutex.
 The results of this routine are unpredictable if this routine is called
 without first locking the mutex.

 This routine automatically releases the mutex and causes the calling
 thread to wait on the condition. If the wait is satisfied as a result of
 some thread calling pthread_cond_signal() or pthread_cond_broadcast(),
 the mutex is reacquired and the routine returns.

 A thread that changes the state of storage protected by the mutex in
 such a way that a predicate associated with a condition variable might
 now be true must call either pthread_cond_signal() or
 pthread_cond_broadcast() for that condition variable. If neither call is
 made, any thread waiting on the condition variable continues to wait.

 This routine might (with low probability) return when the condition
 variable has not been signaled or broadcast. When a spurious wakeup
 occurs, the mutex is reacquired before the routine returns. (To handle
 this type of situation, enclose this routine in a loop that checks the
 predicate.)

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error       Description
    _________________________________________________________________
     0                   Successful completion.

    -1      [EINVAL]     The value specified by cond or mutex is invalid.

    -1      [EDEADLK]    A deadlock condition is detected.

 RELATED INFORMATION

     FUNCTIONS:  pthread_cond_broadcast
                  pthread_cond_destroy
                  pthread_cond_init
                  pthread_cond_signal
                  pthread_cond_timedwait

2.23  –  pthread_create

 NAME

    pthread_create - Creates a thread object and thread

 SYNOPSIS

     #include <pthread.h>

     int pthread_create( pthread_t              *thread,
                         pthread_attr_t         attr,
                         pthread_startroutine_t start_routine,
                         pthread_addr_t         arg );

 PARAMETERS

     thread                Handle to the thread object created.

     attr                  Thread attributes object that defines the
                           characteristics of the thread being created.
                           If you specify pthread_attr_default, default
                           attributes are used.

     start_routine         Function executed as the new thread's start
                           routine.

     arg                   Address value copied and passed to the
                           thread's start routine.

 DESCRIPTION

 The pthread_create() routine creates a thread object and a thread. A
 thread is a single, sequential flow of control within a program. It is
 the active execution of a designated routine, including any nested rou-
 tine invocations.  A thread object defines and controls the executing
 thread.

      CREATING A THREAD

      Calling this routine sets into motion the following actions:

      o    An internal thread object is created to describe the thread.

      o    The associated executable thread is created with attributes
           specified by the attr parameter (or with default attributes
 	  if pthread_attr_default is specified).

      o    The thread parameter receives the new thread.

      o    The start_routine function is called when this routine
           completes successfully.

      THREAD EXECUTION

      The thread is created in the ready state and therefore might
      immediately begin  executing  the function specified by the
      start_routine parameter.  The newly created thread begins running
      before pthread_create() completes if the new thread follows the
      SCHED_RR or SCHED_FIFO scheduling policy or has a priority higher
      than the creating thread, or both.  Otherwise, the new thread
      begins running at its turn, which with sufficient processors
      might also be before pthread_create() returns.

      The start_routine parameter is passed a copy of the arg
      parameter. The value of the arg parameter is unspecified.

      The thread object exists until the pthread_detach() routine is
      called or the thread terminates, whichever occurs last.

      The synchronization between the caller of pthread_create() and the
      newly created  thread is through the use of the pthread_join()
      routine (or any other mutexes or condition variables they agree to
      use).

      TERMINATING A THREAD

      A thread terminates when one of the following events occurs:

      o    The thread returns from its start routine.

      o    The thread exits (within a routine) as the result of calling
           the pthread_exit() routine.

      o    The thread is canceled.

      WHEN A THREAD TERMINATES

      The following actions are performed when a thread terminates:

      o    If the thread terminates by returning from its start routine
           or calling pthread_exit(), the return value is copied into the
           thread object.  If the start routine returns normally and the
           start routine is a procedure that does not return a value,
 	  then the result obtained by pthread_join() is unpredictable.
           If the thread has been cancelled, a return value of -1 is
           copied into the thread object.  The return value can be retri-
           -eved by other threads by calling the pthread_join() routine.

      o    A destructor for each thread-specific data point is removed
           from the list of destructors for this thread and then is
 	  called. This step destroys all the thread-specific data
 	  associated with the current thread.

      o    Each cleanup handler that has been declared by
           pthread_cleanup_push() and not yet removed by
           pthread_cleanup_pop() is called. The most recently pushed
           handler is called first.

      o    A flag is set in the thread object indicating that the thread
           has terminated. This flag must be set in order for callers of
           pthread_join() to return from the call.

      o    A broadcast is made so that all threads currently waiting in a
           call to pthread_join() can return from the call.

      o    The thread object is marked to indicate that it is no longer
           needed by the thread itself. A check is made to determine if
           the thread object is no longer needed by other threads; that
 	  is, if pthread_detach() has been called. If that routine is
 	  called, then the thread object is deallocated.

 RETURN VALUES

 Upon successful completion, this routine stores the  identifier  of  the
 created  thread  at  thread  and  returns 0. Otherwise, a value of -1 is
 returned and no thread is created, the contents of thread are undefined,
 and errno may be set to one of the following values:

    Return   Error      Description
    __________________________________________________
     0                  Successful completion.

    -1      [EAGAIN]    The system lacks the necessary resources
                        to create another thread.

    -1      [ENOMEM]    Insufficient memory exists to create the
                        thread object. This is not a temporary
                        condition.

 RELATED INFORMATION

     FUNCTIONS: pthread_attr_create
                pthread_cancel
                pthread_detach
                pthread_exit
                pthread_join

2.24  –  pthread_delay_np

 NAME

    pthread_delay_np - Causes a thread to wait for a specified period

 SYNOPSIS

     #include <pthread.h>

     int pthread_delay_np( struct timespec *interval );

 PARAMETERS

     interval                Number of seconds and nanoseconds that the
                             calling thread waits before continuing
                             execution. The value specified must be
 			    greater than or equal to 0 (zero).

 DESCRIPTION

 The pthread_delay_np() routine causes a thread to delay execution for a
 specified period of elapsed wall clock time. The period of time the
 thread waits is at least as long as the number of seconds and
 nanoseconds specified in the interval parameter.

 Specifying an interval of 0 seconds and 0 nanoseconds is allowed and can
 result in the thread giving up the processor or delivering a pending
 cancel.

 The struct timespec structure contains two fields, as follows:

    o    The tv_sec field is an integer number of seconds.

    o    The tv_nsec field is an integer number of nanoseconds.

 This routine is not portable.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    _______________________________________________________________
     0                  Successful completion.

    -1      [EINVAL]    The value specified by interval is invalid.

  RELATED INFORMATION

      FUNCTIONS:  pthread_yield

2.25  –  pthread_detach

 NAME

    pthread_detach - Marks a thread object for deletion

 SYNOPSIS

     #include <pthread.h>

     int pthread_detach( pthread_t *thread );

 PARAMETERS

     thread                Thread object marked for deletion.

 DESCRIPTION

 The pthread_detach() routine indicates that storage for the specified
 thread is reclaimed when the thread terminates. This includes storage
 for the thread parameter's return value. If thread has not terminated
 when this routine is called, this routine does not cause it to ter-
 minate.

 Call this routine when a thread object is no longer referenced.  Addi-
 tionally, call this routine for every thread that is created to ensure
 that storage for thread objects does not accumulate.

 You cannot join with a thread after the thread has been detached.
 The results of this routine are unpredictable if the value of thread
 refers to a thread object that does not exist.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    _____________________________________________________________
     0                  Successful completion.

    -1      [EINVAL]    The value specified by thread is invalid.

    -1      [ESRCH]     The value specified by thread does not
                        refer to an existing thread.

 RELATED INFORMATION

     FUNCTIONS:  pthread_cancel
                 pthread_create
                 pthread_exit
                 pthread_join

2.26  –  pthread_equal

 NAME

    pthread_equal - Compares one thread identifier to another thread
                    identifier.

 SYNOPSIS

     #include <pthread.h>

     equal = pthread_equal( pthread_t *thread1,
                             pthread_t thread2 );

 PARAMETERS

     thread1                The first thread identifier to be compared.

     thread2                The second thread identifier to be
 			   compared.

 DESCRIPTION

 This routine compares one thread identifier to another thread identi-
 -fier.(This routine does not check whether the objects that corres-
 -pond to the identifiers currently exist.) If the identifiers have
 values indicating that they designate the same object, 1 (true) is
 returned. If the values do not designate the same object, 0 (false) is
 returned.

 This routine is implemented as a C macro.

 RETURN VALUES

 Possible return values are as follows:

    Return   Error   Description
    __________________________________________________
     0               Values of thread1 and thread2 do not designate the
                     same object.

     1               Values of thread1 and thread2 designate the same
 		    object.

 EXAMPLES

     equal = pthread_equal (thread1, thread2)

 RELATED INFORMATION

     FUNCTIONS: pthread_create

2.27  –  pthread_exit

 NAME

    pthread_exit - Terminates the calling thread

 SYNOPSIS

     #include <pthread.h>

     void pthread_exit( pthread_addr_t status );

 PARAMETERS

     status                Address value copied and returned to the
                            caller of pthread_join().

 DESCRIPTION

 The pthread_exit()  routine terminates the calling thread and makes a
 status value available to any thread that calls pthread_join() and
 specifies the terminating thread.

 An implicit call to pthread_exit() is issued when a thread returns from
 the start routine that was used to create it. The function's return
 value serves as the thread's exit status. If the return value is -1, an
 error exit is forced for the thread instead of a normal exit.  The pro-
 cess exits when the last running thread calls pthread_exit(), with an
 undefined exit status.

 RESTRICTIONS

 The pthread_exit() routine does not work in the main (initial) thread
 because DCE Threads relies on information at the base of thread stacks;
 this information does not exist in the main thread.

 RETURN VALUES

 No value is returned.

 RELATED INFORMATION

     FUNCTIONS: pthread_create
                pthread_detach
                pthread_join

2.28  –  pthread_getprio

 NAME

    pthread_getprio - Obtains the current priority of a thread

 SYNOPSIS

     #include <pthread.h>

     int pthread_getprio( pthread_t thread );

 PARAMETERS

      thread                Thread whose priority is obtained.

 DESCRIPTION

 The pthread_getprio() routine obtains the current priority of a thread.
 The current priority is different from the initial priority of the
 thread if the pthread_setprio() routine is called.

 The exact effect of different priority values depends upon the schedul-
 ing policy assigned to the thread.

 RETURN VALUES

 The current priority value of the thread specified in thread is
 returned. (See the pthread_setprio() reference page for valid values.)

 If the function fails, errno may be set to one of the following values:

    Return           Error      Description
    ________________________________________________________
    Priority value              Successful completion.

    -1              [EINVAL]    The value specified by thread is invalid.

    -1              [ESRCH]     The value specified by thread does not
                                refer to an existing thread.

 RELATED INFORMATION

     FUNCTIONS:  pthread_attr_setprio
                 pthread_setprio
                 pthread_setscheduler

2.29  –  pthread_getscheduler

 NAME

    pthread_getscheduler - Obtains the current scheduling policy
                           of a thread

 SYNOPSIS

     #include <pthread.h>

     int pthread_getscheduler( pthread_t thread );

 PARAMETERS

     thread                Thread whose scheduling policy is obtained.

 DESCRIPTION

 The pthread_getscheduler() routine obtains the current scheduling policy
 of a thread. The current scheduling policy of a thread is different from
 the initial scheduling policy if the pthread_setscheduler() routine is
 called.

 RETURN VALUES

 The current scheduling policy value of the thread specified in thread is
 returned. (See the pthread_setscheduler() reference page for valid
 values.)

 If the function fails, errno may be set to one of the following values:

    Return                Error      Description
    ______________________________________________________________
    Current scheduling policy       Successful completion.

    -1                  [EINVAL]    The value specified by thread
                                    is invalid.

    -1                  [ESRCH]     The value specified by thread does
 				   not refer to an existing thread.

 RELATED INFORMATION

     FUNCTIONS:  pthread_attr_setscheduler
                 pthread_setscheduler

2.30  –  pthread_getspecific

 NAME

    pthread_getspecific - Obtains the thread-specific data associated
                          with the specified key

 SYNOPSIS

     #include <pthread.h>

     int pthread_getspecific( pthread_key_t  key,
                              pthread_addr_t *value );

 PARAMETERS

     key                Context key value that identifies the data
                        value obtained. This key value must be obtained
                        from pthread_keycreate().

     value              Address of the current thread-specific data value
                        associated with the specified key.

 DESCRIPTION

 The pthread_getspecific() routine obtains the thread-specific data asso-
 ciated with the specified key for the current thread.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    _____________________________________________
     0                  Successful completion.

    -1      [EINVAL]    The key value is invalid.

 RELATED INFORMATION

     FUNCTIONS:  pthread_keycreate
                 pthread_setspecific

2.31  –  pthread_get_expiration_np

 NAME

    pthread_get_expiration_np - Obtains a value representing a desired
                                expiration time

 SYNOPSIS

     #include <pthread.h>

     int pthread_get_expiration_np( struct timespec *delta,
                                    struct timespec *abstime );

 PARAMETERS

     delta                Number of seconds and nanoseconds to add to
                          the current system time. The result is the
                          time when a timed wait expires.

     abstime              Value representing the expiration time.

 DESCRIPTION

 The pthread_get_expiration_np() routine adds a specified interval to the
 current absolute system time and returns a new absolute time. This new
 absolute time is used as the expiration time in a call to
 pthread_cond_timedwait().

 This routine is not portable.

 The struct timespec structure contains two fields, as follows:

       o    The tv_sec field is an integer number of seconds.

       o    The tv_nsec field is an integer number of nanoseconds.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    ____________________________________________________________
     0                  Successful completion.

    -1      [EINVAL]    The value specified by delta is invalid.

 RELATED INFORMATION

     FUNCTIONS:  pthread_cond_timedwait

2.32  –  pthread_join

 NAME

    pthread_join - Causes the calling thread to wait for the
                   termination of a specified thread

 SYNOPSIS

     #include <pthread.h>

     int pthread_join( pthread_t      thread,
                        pthread_addr_t *status );

 PARAMETERS

     thread                Thread whose termination is awaited by the
                           caller of this routine.

     status                Status value of the terminating thread when
                           that thread calls pthread_exit().

 DESCRIPTION

 The pthread_join()  routine causes the calling thread to wait for the
 termination of a specified thread. A call to this routine returns after
 the specified thread has terminated.

 Any number of threads can call this routine. All threads are awakened
 when the specified thread terminates.

 If the current thread calls this routine, a deadlock results.

 The results of this routine are unpredictable if the value for thread
 refers to a thread object that no longer exists.

 RETURN VALUES

 If the thread terminates normally, the exit status is the value that is
 is optionally returned from the thread's start routine.

 If the function fails, errno may be set to one of the following values:

    Return   Error       Description
    ______________________________________________________________
     0                   Successful completion.

    -1      [EINVAL]     The value specified by thread is invalid.

    -1      [ESRCH]      The value specified by thread does not
                         refer to a currently existing thread.

    -1      [EDEADLK]    A deadlock is detected.

 RELATED INFORMATION

     FUNCTIONS: pthread_create
                pthread_detach
                pthread_exit

2.33  –  pthread_keycreate

 NAME

    pthread_keycreate - Generates a unique thread-specific data
                        key value

 SYNOPSIS

     #include <pthread.h>

     int pthread_keycreate( pthread_key_t        *key,
                            pthread_destructor_t destructor );

 PARAMETERS

     key                Value of the new thread-specific data key.

     destructor         Procedure to be called to destroy a data value
                        associated with the created key when the thread
                        terminates.

 DESCRIPTION

 The pthread_keycreate()  routine generates a unique thread-specific
 data key value.  This key value identifies a thread-specific data
 value, which is an address of memory generated by the client containing
 arbitrary data of any size.

 Thread-specific data allows client software to associate information
 with the current thread.

 For example, thread-specific data can be used by a language runtime
 library that needs to associate a language-specific thread-private data
 structure with an individual thread. The thread-specific data routines
 also provide a portable means of implementing the class of storage
 called thread-private static, which is needed  to support parallel
 decomposition in the FORTRAN language.

 This routine generates and returns a new key value. Each call to this
 routine within a process returns a key value that is unique within an
 application invocation. Calls to pthread_keycreate() must occur in ini-
 tialization code guaranteed to execute only once in each process.  The
 pthread_once() routine provides a way of specifying such code.

 When multiple facilities share access to thread-specific data, the
 facilities must agree on the key value that is associated with the con-
 text. The key value must be created only once and needs to be stored in
 a location known to each facility. (It may be desirable to encapsulate
 the creation of a key, and the setting and getting of context values for
 that key, within a special facility created for that purpose.)

 When a thread terminates, thread-specific data is automatically des-
 troyed. For each thread-specific data currently associated with the
 thread, the destructor routine associated with the key value of that
 context is called. The order in which per-thread context destructors are
 called at thread termination is undefined.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    _________________________________________________________________
     0                  Successful completion.

    -1      [EINVAL]    The value specified by key is invalid.

    -1      [EAGAIN]    An attempt was made to allocate a key when
                        the key namespace is exhausted.  This is not
                        a temporary condition.

    -1      [ENOMEM]    Insufficient memory exists to create the key.

 RELATED INFORMATION

     FUNCTIONS: pthread_getspecific
                pthread_setspecific

2.34  –  pthread_lock_global_np

 NAME

    pthread_lock_global_np - Locks the global mutex

 SYNOPSIS

     #include <pthread.h>

     void pthread_lock_global_np();

 DESCRIPTION

 The pthread_lock_global_np() routine locks the global mutex. If the glo-
 bal mutex is currently held by another thread when a thread calls this
 routine, the thread waits for the global mutex to become available.
 The thread that has locked the global mutex becomes its current owner
 and remains the owner until the same thread has unlocked it. This rou-
 tine returns with the global mutex in the locked state and with the
 current thread as the global mutex's current owner.

 Use the global mutex when calling a library package that is not designed
 to run in a multithreaded environment. (Unless the documentation for a
 library function specifically states that it is compatible with mul-
 tithreading, assume that it is not compatible; in other words, assume it
 is nonreentrant.)

 The global mutex is one lock. Any code that calls any function that is
 not known to be reentrant uses the same lock. This prevents dependencies
 among threads calling library functions and those functions calling
 other functions, and so on.

 The global mutex is a recursive mutex. A thread that has locked the glo-
 bal mutex can relock it without deadlocking. (The locking thread must
 call pthread_unlock_global_np() as many times as it called this routine
 to allow another thread to lock the global mutex.)

 This routine is not portable.

 RETURN VALUES

 No value is returned.

 RELATED INFORMATION

     FUNCTIONS:  pthread_mutexattr_setkind_np
                 pthread_mutex_lock
                 pthread_mutex_unlock
                 pthread_unlock_global_np

2.35  –  pthread_mutexattr_create

 NAME

    pthread_mutexattr_create - Creates a mutex attributes object

 SYNOPSIS

     #include <pthread.h>

     int pthread_mutexattr_create( pthread_mutexattr_t *attr );

 PARAMETERS

     attr                Mutex attributes object created.

 DESCRIPTION

 The pthread_mutexattr_create() routine creates a mutex attributes object
 used to specify the attributes of mutexes when they are created. The
 mutex attributes object is initialized with the default value for all of
 the attributes defined by a given implementation.

 When a mutex attributes object is used to create a mutex, the values of
 the individual attributes determine the characteristics of the new
 object.  Attributes objects act like additional parameters to object
 creation.  Changing individual attributes does not affect any objects
 that were previously created using the attributes object.

 RETURN VALUES

 The created mutex attributes object is returned to the attr parameter.

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    ___________________________________________________
     0                  Successful completion.

    -1      [EINVAL]    The value specified by attr is invalid.

    -1      [ENOMEM]    Insufficient memory exists to create
                        the mutex attributes object.

 RELATED INFORMATION

     FUNCTIONS:  pthread_create
                 pthread_mutexattr_delete
                 pthread_mutexattr_getkind_np
                 pthread_mutexattr_setkind_np
                 pthread_mutex_init

2.36  –  pthread_mutexattr_delete

 NAME

    pthread_mutexattr_delete - Deletes a mutex attributes object

 SYNOPSIS

     #include <pthread.h>

     int pthread_mutexattr_delete( pthread_mutexattr_t *attr );

 PARAMETERS

     attr                Mutex attributes object deleted.

 DESCRIPTION

 The pthread_mutexattr_delete() routine deletes a mutex attributes
 object. Call this routine when a mutex attributes object is no longer
 referenced by the pthread_mutexattr_create() routine.

 This routine gives permission to reclaim storage for the mutex attri-
 butes object. Mutexes that were created using this attributes object are
 not affected by the deletion of the mutex attributes object.

 The results of calling this routine are unpredictable if the attributes
 object specified in the attr parameter does not exist.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    ___________________________________________________________
     0                  Successful completion.

    -1      [EINVAL]    The value specified by attr is invalid.

 RELATED INFORMATION

     FUNCTIONS:  pthread_mutexattr_create

2.37  –  pthread_mutexattr_getkind_np

 NAME

    pthread_mutexattr_getkind_np - Obtains the mutex type attribute
                                   used when a mutex is created

 SYNOPSIS

     #include <pthread.h>

     int pthread_mutexattr_getkind_np( pthread_mutexattr_t *attr );

 PARAMETERS

     attr                Mutex attributes object whose mutex type
                         is obtained.

 DESCRIPTION

 The pthread_mutexattr_getkind_np()  routine obtains the mutex type
 attribute that is used when a mutex is created.  See the
 pthread_mutexattr_setkind_np() reference page for information about
 mutex type attributes.

 This routine is not portable.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return                 Error      Description
    ______________________________________________________________
    Mutex type attribute              Successful completion.

    -1                    [EINVAL]    The value specified by attr is
                                      invalid.

 RELATED INFORMATION

     FUNCTIONS: pthread_mutexattr_create
                pthread_mutexattr_setkind_np
                pthread_mutex_init

2.38  –  pthread_mutexattr_setkind_np

 NAME

    pthread_mutexattr_setkind_np - Specifies the mutex type attribute

 SYNOPSIS

     #include <pthread.h>

     int pthread_mutexattr_setkind_np( pthread_mutexattr_t *attr,
                                        int                 kind );

 PARAMETERS

     attr                Mutex attributes object modified.

     kind                New value for the mutex type attribute.  The
                         kind parameter specifies the type of mutex
                         that is created. Valid values are MUTEX_FAST_NP
                         (default), MUTEX_RECURSIVE_NP, and
                         MUTEX_NONRECURSIVE_NP.

 DESCRIPTION

 The pthread_mutexattr_setkind_np() routine sets the mutex type attribute
 that is used when a mutex is created.

 A fast mutex is locked and unlocked in the fastest manner possible.  A
 fast mutex can only be locked (obtained) once.  All subsequent calls to
 pthread_mutex_lock() cause the calling thread to block until the mutex
 is freed by the thread that owns it.  If the thread that owns the mutex
 attempts to lock it again, the thread waits for itself to release the
 mutex (causing a deadlock).

 A recursive mutex can be locked more than once by the same thread
 without causing that thread to deadlock. In other words, a single thread
 can make consecutive calls to pthread_mutex_lock() without blocking.
 The thread must then call pthread_mutex_unlock() the same number of
 times as it called pthread_mutex_lock() before another thread can lock
 the mutex.

 A nonrecursive mutex is locked only once by a thread, like a fast mutex.
 If the thread tries to lock the mutex again without first unlocking it,
 the thread receives an error.  Thus, nonrecursive mutexes are more
 informative than fast mutexes because fast mutexes block in such a case,
 leaving it up to you to determine why the thread no longer executes.
 Also, if someone other than the owner tries to unlock a nonrecursive
 mutex, an error is returned.

 Never use a recursive mutex with condition variables because the impli-
 cit unlock performed for a pthread_cond_wait() or
 pthread_cond_timedwait() might not actually release the mutex. In that
 case, no other thread can satisfy the condition of the predicate.
 This routine is not portable.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    _____________________________________________________________
     0                  Successful completion.

    -1      [EINVAL]    The value specified by attr or kind is invalid.

    -1      [EPERM]     The caller does not have the appropriate
                        privileges.

    -1      [ERANGE]    One or more parameters supplied have an invalid
                        value.

 RELATED INFORMATION

     FUNCTIONS:  pthread_mutexattr_create
                 pthread_mutexattr_getkind_np
                 pthread_mutex_init

2.39  –  pthread_mutex_destroy

 NAME

    pthread_mutex_destroy - Deletes a mutex

 SYNOPSIS

     #include <pthread.h>

     int pthread_mutex_destroy( pthread_mutex_t *mutex );

 PARAMETERS

     mutex                Mutex to be deleted.

 DESCRIPTION

 The pthread_mutex_destroy() routine deletes a mutex and must be called
 when a mutex object is no longer referenced. The effect of calling this
 routine is to reclaim storage for the mutex object.

 It is illegal to delete a mutex that has a current owner (in other
 words, is locked).

 The results of this routine are unpredictable if the mutex object speci-
 fied in the mutex parameter does not currently exist.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    ________________________________________________________________
     0                  Successful completion.

    -1      [EBUSY]     An attempt was made to destroy a mutex
                        that is locked.

    -1      [EINVAL]    The value specified by mutex is invalid.

 RELATED INFORMATION

     FUNCTIONS:  pthread_mutex_init
                 pthread_mutex_lock
                 pthread_mutex_trylock
                 pthread_mutex_unlock

2.40  –  pthread_mutex_init

 NAME

    pthread_mutex_init - Creates a mutex

 SYNOPSIS

     #include <pthread.h>

     int pthread_mutex_init( pthread_mutex_t     *mutex,
                              pthread_mutexattr_t attr );

 PARAMETERS

     mutex                Mutex that is created.

     attr                 Attributes object that defines the
                          characteristics of the created mutex.
                          If you specify pthread_mutexattr_default,
                          default attributes are used.

 DESCRIPTION

 The pthread_mutex_init() routine creates a mutex and initializes it to
 the unlocked state.  If the thread that called this routine terminates,
 the created mutex is not automatically deallocated, because it is con-
 sidered shared among multiple threads.

 RETURN VALUES

 If an error condition occurs, this routine returns -1, the mutex is not
 initialized, the contents of mutex are undefined, and errno may be set
 to one of the following values:

    Return   Error      Description
    __________________________________________________________
     0                  Successful completion.

    -1      [EAGAIN]    The system lacks the necessary resources to
                        initialize another mutex.

    -1      [ENOMEM]    Insufficient memory exists to initialize the
                        mutex.

 RELATED INFORMATION

     FUNCTIONS:  pthread_mutexattr_create
                 pthread_mutexattr_getkind_np
                 pthread_mutexattr_setkind_np
                 pthread_mutex_lock
                 pthread_mutex_trylock
                 pthread_mutex_unlock

2.41  –  pthread_mutex_lock

 NAME

    pthread_mutex_lock - Locks an unlocked mutex

 SYNOPSIS

     #include <pthread.h>

     int pthread_mutex_lock( pthread_mutex_t *mutex );

 PARAMETERS

     mutex                Mutex that is locked.

 DESCRIPTION

 The pthread_mutex_lock() routine locks a mutex. If the mutex is locked
 when a thread calls this routine, the thread waits for the mutex to
 become available.

 The thread that has locked a mutex becomes its current owner and remains
 the owner until the same thread has unlocked it. This routine returns
 with the mutex in the locked state and with the current thread as the
 mutex's current owner.

 If you specified a fast mutex in a call to
 pthread_mutexattr_setkind_np(), a deadlock can result if the current
 owner of a mutex calls this routine in an attempt to lock the mutex a
 second time. If you specified a recursive mutex in a call to
 pthread_mutexattr_setkind_np(), the current owner of a mutex can relock
 the same mutex without blocking.  If you specify a nonrecursive mutex in
 a call to pthread_mutexattr_setkind_np(), an error is returned and the
 thread does not block if the current owner of a mutex calls this routine
 in an attempt to lock the mutex a second time.

 The preemption of a lower-priority thread that locks a mutex possibly
 results in the indefinite blocking of higher-priority threads waiting
 for the same mutex. The execution of the waiting higher-priority threads
 is blocked for as long as there is a sufficient number of runable
 threads of any priority between the lower-priority and higher-priority
 values. Priority inversion occurs when any resource is shared between
 threads with different priorities.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error       Description
    _____________________________________________________________
     0                   Successful completion.

    -1      [EINVAL]     The value specified by mutex is invalid.

    -1      [EDEADLK]    A deadlock condition is detected.

 RELATED INFORMATION

     FUNCTIONS:  pthread_mutexattr_setkind_np
                 pthread_mutex_destroy
                 pthread_mutex_init
                 pthread_mutex_trylock
                 pthread_mutex_unlock

2.42  –  pthread_mutex_trylock

 NAME

    pthread_mutex_trylock - Locks a mutex

 SYNOPSIS

     #include <pthread.h>

     int pthread_mutex_trylock( pthread_mutex_t *mutex );

 PARAMETERS

     mutex                Mutex that is locked.

 DESCRIPTION

 The pthread_mutex_trylock() routine locks a mutex. If the specified
 mutex is locked when a thread calls this routine, the calling thread
 does not wait for the mutex to become available.

 When a thread calls this routine, an attempt is made to lock the mutex
 immediately.  If the mutex is successfully locked, 1 is returned and the
 current thread is then the mutex's current owner.

 If the mutex is locked by another thread when this routine is called, 0
 (zero) is returned and the thread does not wait to acquire the lock.  If
 a fast mutex is owned by the current thread, 0 is returned. If a recur-
 sive mutex is owned by the current thread, 1 is returned and the mutex
 is relocked. (To unlock a recursive mutex, each call to
 pthread_mutex_trylock() must be matched by a call to the
 pthread_mutex_unlock() routine.)

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    ____________________________________________________________
     1                  Successful completion.

     0                  The mutex is  locked; therefore, it was
                        not acquired.

    -1      [EINVAL]    The value specified by mutex is invalid.

 RELATED INFORMATION

     FUNCTIONS:  pthread_mutexattr_setkind_np
                 pthread_mutex_destroy
                 pthread_mutex_init
                 pthread_mutex_lock
                 pthread_mutex_unlock

2.43  –  pthread_mutex_unlock

 NAME

    pthread_mutex_unlock - Unlocks a mutex

 SYNOPSIS

     #include <pthread.h>

     int pthread_mutex_unlock( pthread_mutex_t *mutex );

 PARAMETERS

     mutex                Mutex that is unlocked.

 DESCRIPTION

 The pthread_mutex_unlock() routine unlocks a mutex. If no threads are
 waiting for the mutex, the mutex unlocks with no current owner. If one
 or more threads are waiting to lock the specified mutex, this routine
 causes one thread to return from its call to pthread_mutex_lock(). The
 scheduling policy is used to determine which thread acquires the mutex.
 For the SCHED_FIFO and  SCHED_RR policies, a blocked thread is chosen in
 priority order.

 The results of calling this routine are unpredictable if the mutex
 specified in mutex is unlocked. The results of calling this routine are
 also unpredictable if the mutex specified in mutex is currently owned by
 a thread other than the calling thread.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    ____________________________________________________________
     0                  Successful completion.

    -1      [EINVAL]    The value specified by mutex is invalid.

 RELATED INFORMATION

     FUNCTIONS:  pthread_mutexattr_setkind_np
                 pthread_mutex_destroy
                 pthread_mutex_init
                 pthread_mutex_lock
                 pthread_mutex_trylock
                 pthread_unlock_global_np

2.44  –  pthread_once

 NAME

    pthread_once - Calls an initialization routine executed by
                   one thread, a single time

 SYNOPSIS

     #include <pthread.h>

     int pthread_once( pthread_once_t        *once_block,
                       pthread_initroutine_t init_routine );

 PARAMETERS

     once_block                Address of a record that defines the
                               one-time initialization code.  Each
                               one-time initialization routine must
                               have its own unique pthread_once_t data
                               structure.

     init_routine              Address of a procedure that performs the
                               initialization. This routine is called
                               only once, regardless of the number of
                               times it and its associated once_block
                               are passed to pthread_once().

 DESCRIPTION

 The pthread_once() routine calls an initialization routine executed by
 one thread, a single time. This routine allows you to create your own
 initialization code that is guaranteed to be run only once, even if
 called simultaneously by multiple threads or multiple times in the same
 thread.

 For example, a mutex or a thread-specfic data key must be created
 exactly once. Calling pthread_once() prevents the code that creates a
 mutex or thread-specific data from being called by multiple threads.
 Without this routine, the execution must be serialized so that only one
 thread performs the initialization. Other threads that reach the same
 point in the code are delayed until the first thread is finished.

    ---------------------------- NOTE -------------------------------
    If you specify an init_routine that directly or indirectly results
    in a recursive call to pthread_once() and that specifies the same
    init_routine argument, the recursive call can result in a deadlock.
    ------------------------------------------------------------------

 This routine initializes the control record if it has not been initial-
 ized and then determines if the client one-time initialization routine
 has executed once. If it has not executed, this routine calls the ini-
 tialization routine specified in init_routine. If the client one-time
 initialization code has executed once, this routine returns.

 The pthread_once_t data structure is a record that allows client ini-
 tialization operations to guarantee mutual exclusion of access to the
 initialization routine, and that each initialization routine is executed
 exactly once.

 The client code must declare a variable of type pthread_once_t to use
 the client initialization operations. This variable must be initialized
 using the pthread_once_init macro, as follows:

     static pthread_once_t myOnceBlock = pthread_once_init;

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error     Description
    __________________________________________
     0                 Successful completion.

    -1      [EINVAL]   Invalid parameter.

2.45  –  pthread_self

 NAME

    pthread_self - Obtains the identifier of the current thread

 SYNOPSIS

     #include <pthread.h>

     pthread_t pthread_self();

 DESCRIPTION

 The pthread_self() routine allows a thread to obtain its own identifier.
 For example, this identifier allows a thread to set its own priority.

 This value becomes meaningless when the thread object is deleted; that
 is, when the thread terminates its execution and pthread_detach() is
 called.

 RETURN VALUES

 Returns the identifier of the calling thread to pthread_t.

 RELATED INFORMATION

     FUNCTIONS:  pthread_create
                 pthread_setprio
                 pthread_setscheduler

2.46  –  pthread_setasynccancel

 NAME

    pthread_setasynccancel - Enables or disables the current
                             thread's asynchronous cancelability

 SYNOPSIS

     #include <pthread.h>

     int pthread_setasynccancel( int state );

 PARAMETERS

     state                State of asynchronous cancelability set for
                          the calling thread.  On return, receives the
                          prior state of asynchronous cancelability.
                          Valid values are as follows:

                          CANCEL_ON     Asynchronous cancelability is
                                        enabled.

                          CANCEL_OFF    Asynchronous cancelability is
                                        disabled.

 DESCRIPTION

 The pthread_setasynccancel()  routine enables or disables the current
 thread's asynchronous cancelability and returns the previous cancelabil-
 ity state to the state parameter.

 When general cancelability is set to CANCEL_OFF, a cancel cannot be
 delivered to the thread, even if a cancelable routine is called or asyn-
 chronous cancelability is enabled. When general cancelability is set to
 CANCEL_ON, cancelability depends on the state of the thread's asynchro-
 nous cancelability.

 When general cancelability is set to CANCEL_ON and asynchronous cancela-
 bility is set to CANCEL_OFF, the thread can only receive a cancel at
 specific cancellation points (for example, condition waits, thread
 joins, and calls to the pthread_testcancel() routine). If both general
 cancelability and asynchronous cancelability are set to CANCEL_ON, the
 thread can be canceled at any point in its execution.

 When a thread is created, the default asynchronous cancelability state
 is CANCEL_OFF.

 If you call this routine to enable asynchronous cancels, call it in a
 region of code where asynchronous delivery of cancels is disabled by a
 previous call to this routine. Do not call threads routines in regions
 of code where asynchronous delivery of cancels is enabled.  The previous
 state of asynchronous delivery can be restored later by another call to
 this routine.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return       Error      Description
    ___________________________________________________________
    CANCEL_ON               Asynchronous cancelability was on.

    CANCEL_OFF              Asynchronous cancelability was off.

    -1          [EINVAL]    The specified state is not CANCEL_ON
                            or CANCEL_OFF.

 RELATED INFORMATION

     FUNCTIONS: pthread_cancel
                pthread_setcancel
                pthread_testcancel

2.47  –  pthread_setcancel

 NAME

    pthread_setcancel - Enables or disables the current thread's
                        general cancelability

 SYNOPSIS

     #include <pthread.h>

     int pthread_setcancel( int state );

 PARAMETERS

     state                State of general cancelability set for the
                          calling thread.  On return, receives the
                          prior state of general cancelability.  Valid
                          values are as follows:

                          CANCEL_ON    General cancelability is enabled.

                          CANCEL_OFF   General cancelability is disabled.

 DESCRIPTION

 The pthread_setcancel() routine enables or disables the current thread's
 general cancelability and returns the previous cancelability state to
 the state parameter.
 When general cancelability is set to CANCEL_OFF, a cancel cannot be
 delivered to the thread, even if a cancelable routine is called or asyn-
 chronous cancelability is enabled.

 When a thread is created, the default general cancelability state is
 CANCEL_ON.

 POSSIBLE DANGERS OF DISABLING CANCELABILITY

 The most important use of cancels is to ensure that indefinite wait
 operations are terminated. For example, a thread waiting on some network
 connection, which may take days to respond (or may never respond), is
 normally made cancelable.

 However, when cancelability is disabled, no routine is cancelable. Waits
 must be completed normally before a cancel can be delivered. As a
 result, the program stops working and the user is unable to cancel the
 operation.

 When disabling cancelability, be sure that no long waits can occur or
 that it is necessary for other reasons to defer cancels around that par-
 ticular region of code.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return       Error      Description
    ___________________________________________________________
    CANCEL_ON               Asynchronous cancelability was on.

    CANCEL_OFF              Asynchronous cancelability was off.

    -1           [EINVAL]   The specified state is not CANCEL_ON
                            or CANCEL_OFF.

 RELATED INFORMATION

     FUNCTIONS:  pthread_cancel
                 pthread_setasynccancel
                 pthread_testcancel

2.48  –  pthread_setprio

 NAME

    pthread_setprio - Changes the current priority of a thread

 SYNOPSIS

     #include <pthread.h>

     int pthread_setprio( pthread_t thread,
                          int       priority );

 PARAMETERS

     thread              Thread whose priority is changed.

     priority            New priority value of the thread specified
                         in thread.  The priority value depends on
                         scheduling policy. Valid values fall within
                         one of the following ranges:

                         o   PRI_OTHER_MIN <= priority <= PRI_OTHER_MAX

                         o   PRI_FIFO_MIN <= priority <= PRI_FIFO_MAX

                         o   PRI_RR_MIN <= priority <= PRI_RR_MAX

                         o   PRI_FG_MIN_NP <= priority <= PRI_FG_MAX_NP

                         o   PRI_BG_MIN_NP <= priority <= PRI_BG_MAX_NP

 If you create a new  thread  without  specifying  a  threads  attributes
 object  that contains a changed priority attribute, the default priority
 of the newly created thread is the midpoint  between  PRI_OTHER_MIN  and
 PRI_OTHER_MAX  (the midpoint between the minimum and the maximum for the
 SCHED_OTHER policy).

 When you call this routine to specify a minimum or maximum priority, use
 the  appropriate  symbol;  for example, PRI_FIFO_MIN or PRI_FIFO_MAX. To
 specify a value between the minimum  and  maximum,  use  an  appropriate
 arithmetic expression. For example, to specify a priority midway between
 the minimum and maximum for the Round Robin scheduling  policy,  specify
 the following concept using your programming language's syntax:
 pri_rr_mid = (PRI_RR_MIN + PRI_RR_MAX)/2

 If your expression results in a value outside the range  of  minimum  to
 maximum, an error results when you use it.

 DESCRIPTION

 The pthread_setprio() routine changes the current priority of a  thread.
 A  thread  can  change its own priority using the identifier returned by
 pthread_self().

 Changing the priority of a thread can cause it to start executing or  be
 preempted  by  another  thread. The effect of setting different priority
 values depends on the scheduling priority assigned to  the  thread.  The
 initial scheduling priority is set by calling the pthread_attr_setprio()
 routine.

 Note that pthread_attr_setprio() sets the  priority  attribute  that  is
 used to establish the priority of a new thread when it is created.  How-
 ever, pthread_setprio() changes the priority of an existing thread.

 RETURN VALUES

 If successful, this routine returns the previous priority.

 If the function fails, errno may be set to one of the following values:

    Return              Error       Description
    ___________________________________________________________
    Previous priority               Successful completion.

    -1                 [EINVAL]     The value specified by thread is
 				   invalid.

    -1                 [ENOTSUP]    An attempt is made to set the  policy
 				   to an unsupported value.

    -1                 [ESRCH]      The value specified by thread does
 				   not refer to an existing thread.

    -1                 [EPERM]      The caller does not have the
 				   appropriate privileges  to  set  the
 			 	   priority of the specified thread.

 RELATED INFORMATION

     FUNCTIONS:  pthread_attr_setprio
                 pthread_attr_setsched
                 pthread_create
                 pthread_self
                 pthread_setscheduler

2.49  –  pthread_setscheduler

 NAME

    pthread_setscheduler - Changes the current scheduling policy
                           and priority of a thread

 SYNOPSIS

     #include <pthread.h>

     int pthread_setscheduler( pthread_t thread,
                               int       scheduler,
                               int       priority );

 PARAMETERS

     thread                Thread whose scheduling policy is to be
                           changed.

     scheduler             New scheduling policy value for the thread
                           specified in thread.  Valid values are as
                           follows:

                           SCHED_FIFO (First In, First Out)
                                     The highest-priority thread runs
                                     until it blocks. If there is more
                                     than one thread with the same
                                     priority, and that priority is the
                                     highest among other threads, the
                                     first thread to begin running
                                     continues until it blocks.

                           SCHED_RR (Round Robin)
                                     The highest-priority thread runs
                                     until it blocks; however, threads
                                     of equal priority, if that priority
                                     is the highest among other threads,
                                     are timesliced.  Timeslicing is a
                                     process in which threads alternate
                                     using available processors.

                           SCHED_OTHER (Default)
                                     All threads are timesliced.
                                     SCHED_OTHER ensures that all
                                     threads, regardless of priority,
                                     receive some scheduling, and thus
                                     no thread is completely denied
                                     execution time. (However,
 				    SCHED_OTHER threads can be denied
 				    execution time by SCHED_FIFO or
 				    SCHED_RR threads.)

                           SCHED_FG_NP (Foreground)
                                     Same as SCHED_OTHER.  Threads are
                                     timesliced and priorities can be
                                     modified dynamically by the
 				    scheduler to ensure fairness.

                           SCHED_BG_NP (Background)
                                     Like SCHED_OTHER, ensures that all
                                     threads, regardless of priority,
                                     receive some scheduling.  However,
                                     SCHED_BG_NP can be denied execution
                                     by any of the other scheduling
                                     policies.

     priority              New priority value of the thread specified in
                           thread. The priority attribute depends on
                           scheduling policy. Valid values fall within
                           one of the following ranges:

                           o   PRI_OTHER_MIN <= priority <= PRI_OTHER_MAX

                           o   PRI_FIFO_MIN <= priority <= PRI_FIFO_MAX

                           o   PRI_RR_MIN <= priority <= PRI_RR_MAX

                           o   PRI_FG_MIN_NP <= priority <= PRI_FG_MAX_NP

                           o   PRI_BG_MIN_NP <= priority <= PRI_BG_MAX_NP

 If you create a new  thread  without  specifying  a  threads  attributes
 object  that contains a changed priority attribute, the default priority
 of the newly created thread is the midpoint  between  PRI_OTHER_MIN  and
 PRI_OTHER_MAX  (the midpoint between the minimum and the maximum for the
 SCHED_OTHER policy).

 When you call this routine to specify a minimum or maximum priority, use
 the  appropriate  symbol;  for example, PRI_FIFO_MIN or PRI_FIFO_MAX. To
 specify a value between the minimum  and  maximum,  use  an  appropriate
 arithmetic expression. For example, to specify a priority midway between
 the minimum and maximum for the Round Robin scheduling  policy,  specify
 the following concept using your programming language's syntax:

      pri_rr_mid = (PRI_RR_MIN + PRI_RR_MAX)/2

 If your expression results in a value outside the range  of  minimum  to
 maximum, an error results when you use it.

 DESCRIPTION

 The pthread_setscheduler() routine changes the current scheduling policy
 and priority of a thread.  Call this routine to change both the priority
 and scheduling policy of a thread at the same time. To change  only  the
 priority, call the pthread_setprio() routine.

 A thread changes its own scheduling policy and  priority  by  using  the
 identifier  returned  by pthread_self().  Changing the scheduling policy
 or priority, or both, of a thread can cause it to start executing or  to
 be preempted by another thread.

 This routine differs from pthread_attr_setprio() and
 pthread_attr_setsched()  because  those  routines  set  the priority and
 scheduling policy attributes that are used to establish the priority and
 scheduling policy of a new thread when it is created. This routine, how-
 ever, changes the priority and scheduling policy of an existing thread.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error       Description
    ______________________________________________________________
     0                   Successful completion.

    -1      [EINVAL]     The value specified by thread is invalid.

    -1      [ENOTSUP]    An attempt is made to set the  policy  to
                         an unsupported value.

    -1      [ESRCH]      The value specified by  thread  does  not
                         refer to an existing thread.

    -1      [EPERM]      The caller does not have the  appropriate
                         privileges  to  set  the  priority of the
                         specified thread.

 RELATED INFORMATION

     FUNCTIONS:  pthread_attr_setprio
                 pthread_attr_setsched
                 pthread_create
                 pthread_self
                 pthread_setprio

2.50  –  pthread_setspecific

 NAME

    pthread_setspecific - Sets the thread-specific data associated
                          with the specified key for the current thread

 SYNOPSIS

     #include <pthread.h>

     int pthread_setspecific( pthread_key_t  key,
                              pthread_addr_t value );

 PARAMETERS

     key                Context key value that uniquely identifies the
                        context value specified in value. This key value
                        must have been obtained from pthread_keycreate().

     value              Address containing data to be associated with the
                        specified key for the current thread; this is the
                        thread-specific data.

 DESCRIPTION

 The pthread_setspecific() routine sets the thread-specific data associ-
 ated with the specified key for the current thread. If a value has
 already been defined for the key in this thread, the new value is sub-
 stituted for it.

 Different threads can bind different values to the same key. These
 values are typically pointers to blocks of dynamically allocated memory
 that are reserved for use by the calling thread.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    _____________________________________________
     0                  Successful completion.

    -1      [EINVAL]    The key value is invalid.

 RELATED INFORMATION

     FUNCTIONS:  pthread_getspecific
                 pthread_keycreate

2.51  –  pthread_signal_to_cancel_np

 NAME

    pthread_signal_to_cancel_np - Cancels the specified thread

 SYNOPSIS

     #include <pthread.h>

     int pthread_signal_to_cancel_np( sigset_t  *sigset,
                                      pthread_t *thread );

 PARAMETERS

     sigset                Signal mask containing a list of signals that,
                           when received by the process, cancels the
                           specified thread.

     thread                Thread canceled if a valid signal is received
                           by the process.

 DESCRIPTION

 The pthread_signal_to_cancel_np() routine requests that the specified
 thread be canceled if one of the signals specified in the signal mask is
 received by the process.  The set of legal signals is the same as that
 for the sigwait() service. The sigset parameter is not validated. If it
 is invalid, this routine will return successfully but neither the speci-
 fied thread nor the previously specified thread will be canceled if a
 signal occurs.

 Note that the address of the specified thread is saved in a per-process
 global variable.  Therefore, any subsequent call to this routine by your
 application or any library function will supercede the thread specified
 in the previous call, and that thread will not be canceled if one of the
 signals specified for it is delivered to the process.  In other words,
 take care when you call this routine; if another thread calls it after
 you do, the expected result of this routine will not occur.

 RETURN VALUES

 If the function fails, errno may be set to one of the following values:

    Return   Error      Description
    _____________________________________________________________
     0                  Successful completion.

    -1      [EINVAL]    The value specified by thread is invalid.

 RELATED INFORMATION

     FUNCTIONS:  pthread_cancel

2.52  –  pthread_testcancel

 NAME

     pthread_testcancel - Requests delivery of a pending cancel to the
                          current thread

 SYNOPSIS

     #include <pthread.h>

     void pthread_testcancel();

 DESCRIPTION

 The pthread_testcancel() routine requests delivery of a pending cancel
 to the current thread.  The cancel is delivered only if a cancel is
 pending for the current thread and general cancel delivery is not
 currently disabled. (A thread disables delivery of cancels to itself by
 calling the pthread_setcancel() routine.)

 This routine, when called within very long loops, ensures that a pending
 cancel is noticed within a reasonable amount of time.

 RETURN VALUES

 No value is returned.

 RELATED INFORMATION

     FUNCTIONS:  pthread_cancel
                 pthread_setasynccancel
                 pthread_setcancel

2.53  –  pthread_unlock_global_np

 NAME

     pthread_unlock_global_np - Unlocks a global mutex

 SYNOPSIS

     #include <pthread.h>

     void pthread_unlock_global_np();

 DESCRIPTION

 The pthread_unlock_global_np() routine unlocks the global mutex when
 each call to pthread_lock_global_np() is matched by a call to this rou-
 tine. For example, if you called pthread_lock_global_np() three times,
 pthread_unlock_global_np() unlocks the global mutex when you call it
 the third time. If no threads are waiting for the global mutex, it
 becomes unlocked with no current owner. If one or more threads are
 waiting to lock the global mutex, one thread returns from its call to
 pthread_lock_global_np(). The scheduling policy is used to determine
 which thread acquires the global mutex. For the policies SCHED_FIFO and
 SCHED_RR, a blocked thread is chosen in priority order.

 The results of calling this routine are unpredictable if the global
 mutex is already unlocked. The results of calling this routine are also
 unpredictable if the global mutex is owned by a thread other than the
 calling thread.

 This routine is not portable.

 RETURN VALUES

 No value is returned.

 RELATED INFORMATION

     FUNCTIONS:  pthread_lock_global_np
                 pthread_mutexattr_setkind_np
                 pthread_mutex_lock
                 pthread_mutex_unlock

2.54  –  pthread_yield

 NAME

    pthread_yield - Notifies the scheduler that the current thread
                    is willing to release its processor

 SYNOPSIS

     #include <pthread.h>

     void pthread_yield();

 DESCRIPTION

 The pthread_yield() routine notifies the scheduler that the current
 thread is willing to release its processor to other threads of the same
 priority. (A thread releases its processor to a thread of a higher
 priority without calling this routine.)

 If the current thread's scheduling policy (as specified in a call to the
 pthread_attr_setsched() or pthread_setscheduler() routine) is SCHED_FIFO
 or SCHED_RR, this routine yields the processor to other threads of the
 same or a higher priority. If no threads of the same priority are ready
 to execute, the thread continues.

 This routine allows knowledge of the details of an application to be
 used to increase fairness. It increases fairness of access to the pro-
 cessor by removing the current thread from the processor. It also
 increases  fairness of access to shared resources by removing the
 current thread from the processor as soon as it is finished with the
 resource.

 Call this routine when a thread is executing code that denies access to
 other threads on a uniprocessor if the scheduling policy is SCHED_FIFO.

 Use pthread_yield() carefully because misuse causes unnecessary context
 switching, which increases overhead without increasing fairness. For
 example, it is counterproductive for a thread to yield while it has a
 needed resource locked.

 RETURN VALUES

 No value is returned.

 RELATED INFORMATION

     FUNCTIONS:  pthread_attr_setsched
                 pthread_setscheduler

2.55  –  sigwait

 NAME

    sigwait - Causes a thread to wait for an asynchronous signal

 SYNOPSIS

     #include <pthread.h>

     int sigwait( sigset_t *set );

 PARAMETERS

     set                Set of asynchronous pending signals from which
                        this routine chooses one signal on which the
                        calling thread will wait.

 DESCRIPTION

 This routine causes a thread to wait for an asynchronous signal by
 choosing a pending signal from set, atomically clearing it from the
 system's set of pending signals and returning that signal number.  If no
 signal in set is pending at the time of the call, the thread is blocked
 until one or more signals becomes pending.  The signals defined by set
 may be unblocked during the call to this routine and will be blocked
 when the thread returns from the call unless some other thread is
 currently waiting for one of those signals.

 If more than one thread is using this routine to wait for the same
 signal, only one of these threads will return from this routine with the
 signal number.

 RETURN VALUES

 Possible return values are as follows:

    Return          Error      Description
    __________________________________________________
    Signal number              Successful completion.

    -1             [EINVAL]    The value specified by set is
                               invalid.

 RELATED INFORMATION

     FUNCTIONS: pthread_cancel
                pthread_setasynccancel
Close Help