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

プリミティブの比較

スレッドで使われる最も基本的な同期プリミティブは、相互排他ロックです。相互排他ロックは、メモリー使用量と実行時間の両面でもっとも効率的な機構です。相互排他ロックの主要目的は、リソースへのアクセスを直列化することです。

その次に効率の高いプリミティブは、条件変数です。条件変数の主要目的は、状態の変化に基づいてスレッドをブロックすることです。条件変数は、スレッド待ち機能を提供します。条件変数でスレッドをブロックする場合は、その前に相互排他ロックを獲得しなければなりません。また、pthread_cond_wait() から戻ったあとに相互排他ロックを解除しなければいけません。また、対応する pthread_cond_signal() 呼び出しまで状態の変更が行われる間、相互排他ロックを保持しておかなければなりません。

セマフォーは、条件変数より多くのメモリーを使用します。セマフォーは、状況によっては条件変数よりも簡単に使用できます。セマフォー変数は、制御でなく状態に基づいて機能するからです。また、ロックのように保持するという概念もありません。スレッドをブロックしているセマフォーに対して、どのスレッドもセマフォーの値を 1 増やすことができます。

読み取り/書き込みロックを使用すると、保護されたリソースに対する、並行する複数の読み取り操作や排他的な書き込み操作ができます。読み取り/書き込みロックは単一の実体で、読み取りモードまたは書き込みモードでロック可能です。リソースを変更するには、スレッドがまず排他書き込みロックを獲得する必要があります。すべての読み取りロックが開放されない限り、排他書き込みロックは許可されません。