マルチスレッド・プログラムの開発
マルチスレッド・プログラムの開発は、複数プロセスのプログラムの開発とほぼ同じです。プログラムの開発は、コードのコンパイルおよびデバッグからなります。
マルチスレッド・プログラムのコンパイル
- 必須のヘッダー・ファイル
- マルチスレッド・プログラムの生成に使用されるコンパイラーの起動
ヘッダー・ファイル
スレッド・ライブラリーを使用するためのすべてのサブルーチン・プロトタイプ、マクロ、およびその他の定義は、/usr/include ディレクトリーに置かれている pthread.h ヘッダー・ファイル内にあります。 pthread.h ヘッダー・ファイルは、スレッド・ライブラリーを使用する各ソース・ファイルに組み込まれている必要があります。
pthread.h ヘッダーには、次のグローバル定義を提供する unistd.h ヘッダーが組み込まれています。
- _POSIX_REENTRANT_FUNCTIONS
- すべての関数が再入可能でなければならないことを指定します。 複数のヘッダー・ファイルがこのシンボルを使用して、 localtime_r サブルーチンなどの補足再入可能サブルーチンを定義します。
- _POSIX_THREADS
- POSIX スレッド API を示します。 このシンボルは、POSIX スレッド API が使用可能かどうかのチェックに使用されます。 マクロやサブルーチンは、POSIX または他のいくつかのスレッド API を使用するか否かによって、 さまざまな方法で定義することができます。
pthread.h ファイルには errno.h も組み込まれています。そのファイルで、errno グローバル変数はスレッド固有に再定義されています。 したがって、errno ID は、マルチスレッド・プログラムの左辺値ではなくなります。
コンパイラーの起動
- xlc_r
- ansi のデフォルト言語レベルでコンパイラーを起動します。
- cc_r
- extended のデフォルト言語レベルでコンパイラーを起動します。
これらのコマンドによって、Single UNIX Specification, Version 2 に準拠するように、 適切なオプションとライブラリーを使用することができます。 POSIX スレッド仕様 1003.1c は、Single UNIX Specification, Version 2 のサブセットです。
- libpthreads.a
- スレッド・ライブラリー
- libc.a
- 標準 C ライブラリー
cc_r -o foo foo.cPOSIX 1003.1c のドラフト 7 用コンパイラーの起動
AIX® では、ドラフト 7 アプリケーションのソース・コードに互換性があります。 開発者は、スレッド化アプリケーションを、 最新の標準システムに移植することをお勧めします。
- xlc_r7
- ansi のデフォルト言語レベルでコンパイラーを起動します。
- cc_r7
- extended のデフォルト言語レベルでコンパイラーを起動します。
- libpthreads_compat.a
- ドラフト 7 互換スレッド・ライブラリー
- libpthreads.a
- スレッド・ライブラリー
- libc.a
- 標準 C ライブラリー
ソース・コード互換性を実現するには、コンパイラー指示 _AIX_PTHREADS_D7 を使用します。 さらに、ライブラリーを libpthreads_compat.a、libpthreads.a、そして libc.a の順序でリンクする必要があります。 大部分のユーザーは、この情報を知っている必要はありません。 上記のコマンドが必要なオプションを提供するからです。 これらのオプションは、最新の AIX コンパイラーを持っていないユーザーのために用意されています。
&Symbol.unixspec; へのドラフト 7 アプリケーションの移植
- errno についてのわずかな相違。 最も一般的なものは、ESRCH を使用しても、 指定された pthread が見つからないことがあるということです。 ドラフト 7 では、この障害による EINVAL が頻繁に戻されます。
- pthread の作成時のデフォルトの状態は、結合可能 です。 これは、無視されるとメモリー・リークになる可能性があるので、重大な変更です。
- デフォルトの pthread スケジューリング・パラメーターは 有効範囲 です。
- pthread_yield サブルーチンは、sched_yield サブルーチンに置き換えられました。
- 相互排除ロックに関連したさまざまなスケジューリング・ポリシーが多少異なります。
マルチスレッド・プログラムのメモリー所要量
| データ・モデル | -bmaxdata | 最大 Pthread 数 |
|---|---|---|
| 小さいデータ | 適用不能 | 1084 |
| 大きいデータ | 0x10000000 | 2169 |
| 大きいデータ | 0x20000000 | 4340 |
| 大きいデータ | 0x30000000 | 6510 |
| 大きいデータ | 0x40000000 | 8681 |
| 大きいデータ | 0x50000000 | 10852 |
| 大きいデータ | 0x60000000 | 13022 |
| 大きいデータ | 0x70000000 | 15193 |
| 大きいデータ | 0x80000000 | 17364 |
マルチスレッド・プログラムの例
#include <pthread.h> /* include file for pthreads - the 1st */
#include <stdio.h> /* include file for printf() */
#include <unistd.h> /* include file for sleep() */
void *Thread(void *string)
{
while (1)
printf("%s¥n", (char *)string);
pthread_exit(NULL);
}
int main()
{
char *e_str = "Hello!";
char *f_str = "Bonjour !";
pthread_t e_th;
pthread_t f_th;
int rc;
rc = pthread_create(&e_th, NULL, Thread, (void *)e_str);
if (rc)
exit(-1);
rc = pthread_create(&f_th, NULL, Thread, (void *)f_str);
if (rc)
exit(-1);
sleep(5);
/* usually the exit subroutine should not be used
see below to get more information */
exit(0);
}初期スレッド (main ルーチンを実行している) は、2 つのスレッドを作成します。 両方のスレッドとも、 同じエントリー・ポイント・ルーチン (Thread ルーチン) を持っていますが、 パラメーターは異なります。 このパラメーターは、表示される文字列を指すポインターです。
マルチスレッド・プログラムのデバッグ
- アプリケーション・プログラマーは、 dbx コマンドを使用してデバッグを実行することができます。 スレッド関連のオブジェクトを表示するために、複数のサブコマンド (attribute、condition、mutex、および thread) が使用可能です。
- カーネル・プログラマーは、カーネル・デバッグ・プログラムを使用して、
カーネル・エクステンションとデバイス・ドライバーのデバッグを実行することができます。 カーネル・デバッグ・プログラムは、
ユーザー・スレッドへのアクセスを制限し、
主にカーネル・スレッドの操作を行います。 次のものを含めて、いくつかのサブコマンドが複数のカーネル・スレッドとプロセッサーをサポートします。
- cpu サブコマンド。現行のプロセッサーを変更します。
- ppd サブコマンド。プロセッサーごとのデータ構造を表示します。
- thread サブコマンド。スレッド・テーブル項目を表示します。
- uthread サブコマンド。スレッドの uthread 構造を表示します。
マルチスレッド・プログラムのコア・ファイル要件
chdev -l sys0 -a fullcore=trueそれぞれの pthread が、生成されたコア・ファイルのサイズに追加されます。 pthread に必要なコア・ファイル・スペースの量には、ユーザーが pthread_attr_setstacksize サブルーチンによって制御できるスタック・サイズが含まれます。 NULL の pthread 属性で作成された pthread の場合、 32 ビット・プロセス内の各 pthread は、 コア・ファイルのサイズに 128 KB を追加し、 64 ビット・プロセス内の各 pthread はコア・ファイルのサイズに 256 KB を追加します。