VMS Help
DCE_THREADS

 *Conan The Librarian (sorry for the slow response - running on an old VAX)

  DESCRIPTION

  DECthreads, Compaq'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 scheduling
  attribute of thread creation.  The inherit scheduling attribute specifies
  whether threads created using the specified thread attributes object
  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 retrieved 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 identifier.
  (This routine does not check whether the objects that correspond 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     HLB-list     TLB-list     Help  

[legal] [privacy] [GNU] [policy] [netiquette] [sponsors] [FAQ]
Tweet
Polarhome, production since 1999.
Member of Polarhome portal.