MasaのITC Life

夢は起業家!全てにおいて凡人だけど頑張ることだけはいっちょ前!

プログラミング

【C言語】マルチスレッドでMutex(排他制御)をやってみた

投稿日:2019年12月26日 更新日:



前回の記事では、

マルチスレッドプログラミングを

ご紹介しました。




前回のは、最後にリンク貼っておくので、

そっちを先に読むと理解しやすいかも。




今回はMutexを使うことで、

スレッド間で共有する変数に

排他制御を施していきます。




排他制御にはセマフォなど、

有名なものが他にもありますが、

今回は「Mutex」を使います。




「ここで他のスレッドに処理が、

切り替わってはいけない!!」

というパートを保護するものです。

(クリティカルセクションと呼ぶ)




しかしクリティカルセクションは、

プログラマーが決めるので、

コンピュータにも分かるように、

ソース上で明示する必要があります。




処理がクリティカルセクションに

入るときに「ロック」を宣言し、

出るときに「アンロック」を宣言します。




そして、「どこからどこまでを

クリティカルセクションとするか」

によって処理の整合性が変わります。




スレッド間で共通変数を、

書き込む箇所がそれに該当します。




それでは、前回の例をもとに、

Mutexを使って書き換えてみます。




ロック or アンロックの状況を

格納するための変数を最初に用意します。

pthread_mutex_t型のmutex用の

変数がpthreadライブラリに用意されています。




クリティカルセクションに入るときに

ロックを宣言します。宣言するときは、

pthread_mutex_lock関数を使います。


引数はpthread_mutex_t型の

変数のアドレスを渡します。

これで他のスレッドに邪魔されずに、

処理を進めることが出来ます。




クリティカルセクションを出るときは、

アンロックを宣言する必要があります。

pthread_mutex_unlock関数を使います。



pthread_mutex_lockと同様に、

引数にはpthead_mutex_t型変数の

アドレスを指定します。




pthread_mutex_lockもpthread_mutex_unlockも

成功すれば0を、失敗すれば非ゼロの

エラーコードを戻り値として返します。




またmain文では最初と最後に。

phread_mutex_init関数と

pthread_mutex_destroy関数を

呼び出します。


プログラムの処理を追っていくと、

実は一方のスレッドが全て和を計算した後に、

残ったスレッドが和を計算します。




今回はシンプルにするために、

和を計算するだけのスレッドを作成しました。

他のスレッドが和を計算してるときは、

終了するのを待たないと共通変数を使えません。




これではスレッドを使わない

プログラムと同じに思えるかもしれません。




しかし終了を待っているときに、

他の処理を進めてあげれば、

スレッドプログラミングの

効果を実感できるかと思います。






最後まで読んでいただきありがとうございました。



前回の記事↓↓↓



-プログラミング

Copyright© MasaのITC Life , 2023 All Rights Reserved Powered by STINGER.