PthreadIntro
20/30 int x=2; pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; void b(){ pthread_mutex_lock(&mutex); x=x+4; pthread_mutex_unlock(&mutex); } void a(){  pthread_mutex_lock(&mutex);   x=x+1; pthread_mutex_unlock(&mutex); } int main(){ // ここは同じ }

【テロップ】
※各テロップ文字をクリックすると該当の場所がピンポイントで閲覧できます。



【ノート】
この図に、排他制御をするための基本的なプログラム例を示します。 まず、排他制御をするために、ミューテックスという特殊な型の変数を宣言します。 型は、pスレッドアンダースコアミューテックスアンダースコアtという、特殊な型名になっています。これで変数を一つ宣言します。 ここでは、ミューテックスという名前の変数にしています。 また、この変数は初期化が必要で、pスレッドミューテックスイニシャライザという定数で初期化します。 長い名前ですので、メモしておきましょう。 pスレッドミューテックスイニシャライザです。 さて、排他制御したい区間はロック関数とアンロック関数で囲みます。 今回は、関数aの加算をする部分及び関数bの関数の加算をする部分は、お互いに同時に実行してはいけないので、 この部分を囲みます。 排他制御をする区間の前に、pスレッドミューテックスロックという関数を置きます。引き数には、さきほど宣言したミューテックス変数のポインタを書きます。この関数名も長い名前ですので、メモしておきましょう。 pスレッドミューテックスロックです。 排他制御する区間の後に、pスレッドミューテックスアンロックという関数を置きます。引き数には、さきほど宣言したミューテックス変数のポインタを書きます。この関数名も長い名前ですので、メモしておきましょう。 pスレッドミューテックスアンロックです。ロックではなくアンロックであることに注意しましょう。 これにより、排他制御された区間は、同時に実行されることはなくなりました。ただ、その反面、並列実行できる部分が減ることになりますので、 排他制御は必要最小限にする工夫が必要になります。