XL Fortran for AIX V8.1.1

ユーザーズ・ガイド


C を使用した THREADLOCAL 共通ブロックと ILC

Fortran THREADLOCAL 共通ブロックは、 POSIX pthreads ライブラリーで定義された、スレッド固有のデータ機能を使用してインプリメントされます。スレッド固有のデータ域についての詳細は、スレッド・プログラミングに関する AIX の資料を参照してください。

内部的には、スレッド固有の共通ブロックのためのストレージは、 Fortran 実行時ライブラリーによって動的に割り振られます。この Fortran 実行時ライブラリーは、共通ブロックについての情報を保持する制御構造体を保守します。この制御域は、共通ブロックの名前と同じ名前が付いた外部構造体のことです。

たとえば、以下のように Fortran で共通ブロックを宣言した場合、

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

Fortran コンパイラーによって作成されるのは、スレッド固有の共通ブロックについての制御情報を含む、myblock という外部構造体 (または共通域) です。この制御構造体は以下のようなレイアウトになり、C でも同じようにコーディングされます。

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

「key」 フィールドは、スレッド・ローカル・データ域を記述する、固有の ID です。それぞれのスレッド・ローカルの共通ブロックには、独自のキーがあります。「flags」 フィールドは、共通ブロックのためにキーが取得されているかどうかを示します。 C 関数内では、スレッド・ローカルの共通域のスレッド固有アドレスを取得するために、pthread_getspecific への呼び出しで、制御ブロックのこの 「key」 を使用する必要があります。


! 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

詳細については、「XL Fortran for AIX ランゲージ・リファレンス 」の THREADLOCAL ディレクティブを参照してください。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]