XL Fortran for AIX 8.1

User's Guide


THREADLOCAL Common Blocks and ILC with C

Fortran THREADLOCAL common blocks are implemented using the thread-specific data facilities that are defined by the POSIX pthreads library. For additional information about thread-specific data areas, please refer to AIX documentation on threads programming.

Internally, the storage for the thread-specific common block is allocated dynamically by the Fortran run-time library. The Fortran run-time library maintains a control structure that holds information about the common block. This control area is an external structure whose name is the name of the common block.

For example, if you declare a common block in Fortran as the following:

         common /myblock/ i
!ibm*    threadlocal /myblock/

the Fortran compiler creates an external structure (or common area) that is named myblock, which contains control information about the thread-specific common block. The control structure has the following layout and would be coded as such in C:

       typedef struct {
          pthread_key_t key;
          int flags;
          void *unused_1;
          int unused_2;
       } FORT_LOCAL_COMMON;
       extern FORT_LOCAL_COMMON myblock;

The "key" field is a unique identifier that describes a threadlocal data area. Every threadlocal common block has its own key. The "flags" field indicates whether a key has been obtained for the common block. Within a C function, you should use the "key" in the control block in a call to pthread_getspecific to obtain the thread-specific address of the threadlocal common area.

Example


! Example 1:  "fort_sub" is invoked by multiple threads.  This is an invalid example
! because "fort_sub" and "another_sub" both declare /block/ to be THREADLOCAL.
! They intend to share the common block, but they are executed by different threads.
 
SUBROUTINE fort_sub()
  COMMON /block/ j
  INTEGER :: j
  !IBM* THREADLOCAL /block/        ! Each thread executing fort_sub
                                   ! obtains its own copy of /block/.
  INTEGER a(10)
 
  ...
  !IBM* INDEPENDENT
  DO index = 1,10
    CALL another_sub(a(i))
  END DO
  ...
 
END SUBROUTINE fort_sub
 
SUBROUTINE another_sub(aa)        ! Multiple threads are used to execute another_sub.
  INTEGER aa
  COMMON /block/ j                ! Each thread obtains a new copy of the
  INTEGER :: j                    ! common block:  /block/.
  !IBM* THREADLOCAL /block/
  ...
  aa = j                          ! The value of 'j' is undefined.
END SUBROUTINE another_sub

For more information on the THREADLOCAL directive, see "Directives" in the XL Fortran for AIX Language Reference.


[ Top of Page | Previous Page | Next Page | Table of Contents | Index ]