Oracle® Solaris Studio 12.4: パフォーマンスアナライザ

印刷ビューの終了

更新: 2015 年 1 月
 
 

明示的なマルチスレッド化

単純なプログラムは、シングルスレッド内で実行されます。マルチスレッド化された実行可能ファイルはスレッド作成関数を呼び出し、その関数に実行されるターゲット関数が渡されます。ターゲットの終了時にスレッドが破棄されます。

Oracle Solaris では、Solaris スレッドと POSIX スレッド (Pthread) の 2 種類のスレッド実装がサポートされています。Oracle Solaris 10 以降、両方のスレッド実装が libc.so に含まれます。

Solaris スレッドでは、新しく作成されたスレッドは、スレッド作成呼び出しで渡された関数を呼び出す _thread_start() と呼ばれる関数で実行を開始します。このスレッドによって実行されるターゲットが関係するどの呼び出しスタックでも、スタックの先頭は _thread_start() であり、スレッド作成関数の呼び出し元に接続することはありません。そのため、作成されたスレッドに関連付けられた包括的メトリックは、_thread_start() および <Total> 関数までしか伝播されません。スレッドの作成に加えて、Solaris のスレッド実装では、スレッドを実行するために LWP が Solaris 上に作成されます。LWPSolaris スレッドによる作成スレッドはそれぞれ特定の LWP に結合されます。

Oracle Solaris と Linux では、明示的なマルチスレッド化に Pthread を使用できます。

どちらの環境でも、新しいスレッドを作成するには、アプリケーションが Pthread API 関数 pthread_create() を呼び出して、関数引数の 1 つとして、ポインタをアプリケーション定義の起動ルーチンに渡します。

Oracle Solaris 10 より前の Solaris バージョンでは、新しい pthread の実行の開始時に _lwp_start() 関数が呼び出されます。Oracle Solaris 10 以降では、_lwp_start() から中間関数 _thrp_setup() が呼び出され、そこから pthread_create() で指定されたアプリケーション定義の起動ルーチンが呼び出されます。

Linux オペレーティングシステムでは、新しい pthread の実行の開始時に Linux 固有のシステム関数 clone() が呼び出され、そこから別の内部初期化関数 pthread_start_thread() が呼び出され、そこから、pthread_create() で指定されたアプリケーション定義の起動ルーチンが呼び出されます。コレクタで使用できる Linux メトリック収集関数はスレッドに固有です。そのため、collect ユーティリティーが実行されると、このユーティリティーは、pthread_start_thread() とアプリケーション定義のスレッド起動ルーチンの間に collector_root() という名前のメトリック収集関数を割り込ませます。