PthreadIntro
6/30 int x=2; void b(){ x=4; } void a(){ } int main(){ create(a()); create(b()); : join(a()); join(b()); printf(“%d\n”,x) }
【テロップ】
※各テロップ文字をクリックすると該当の場所がピンポイントで閲覧できます。
【ノート】
マルチスレッドでは、 同時並行的に実行される処理単位を、動的に及び静的に生成し、 必要に応じて、スレッド間で同期させて実行を行います。 マルチスレッドでは、スレッドを生成する、すなわちクリエイトする関数と、スレッドの終了を待ち合わせる、すなわち、ジョインする関数があります。 この例では、関数エーを実行するスレッドと、関数bを実行するスレッドを生成されます。 まず、main関数が起動し、関数エーを実行するスレッドと、関数bを実行するスレッドを、クリエイト関数を用いて生成します。 なお、具体的な、ポジックスの関数はのちほど紹介します。 これにより、新たに2個のスレッドが生成されたので、合計3個のスレッドが存在します。 これらのスレッドは同時に実行可能なので、使用できるコアが3個以上あれば、同時に実行されます。もし、3個未満であれば、複数のスレッドは、じ分割して実行されますが、それについてはここではこれ以上考えません。 新たに生成されたスレッドの終了を、main関数のジョイン関数で待ち、そののち、main関数の残りを行って、プログラム全体が終了します。 このように、一つのプログラム中の、3つの部分すなわち、スレッドが、同時並行で実行できますので、一般的には実行の高速化が可能となります。このような方式をマルチスレッド、もしくは、マルチスレディングといい、並行処理の基本的な手法となります。 なお、main関数の最後で変数xのあたいを表示していますが、 関数bを実行しているスレッドは、 ジョイン関数で終了していることが確認されているので、変数xの表示は4となります。 すなわち、マルチスレッドではメモリはスレッド間で共有されることが基本となります。 マルチスレッドを用いたプログラミングは、今回のポジックススレッド以外に、オープンエムピー、オープンエーシーシー、クーダ、オープンシーエルなど、いろいろなプログラミングスタイルがありますが、それらについては別の機会に紹介したいと思います。