スレッド間通信の実現ボイスチャットシステムではスレッド間の通信方法として、メッセージ方式を採用しています。 この章では、スレッド間でメッセージを受け渡す方法について解説します。 ここから先は、複数スレッドの相互作用についての知識がある程度あることを前提として書かれています。 したがって必要な方は、 「オペレーティング・システム講座 並行プロセス編」を参考にしてください。 FIFOバッファメッセージを受け渡すだけならば、単純な共有メモリを設置するだけで、情報の受け渡しはできます。 しかし、情報の生産側の生産速度や消費側の消費速度が一定でない場合、 それぞれのスレッドは頻繁に停止してしまうため、効率が悪くなってしまいます。 そこで、その不安定な生産速度や消費速度の影響を軽減する方法として、 FIFOバッファを用いました。FIFOバッファ(First In First Out Buffer)とは図1に示すように、 バッファに投函された順にメッセージを取り出すことができる仕組みです。 構造はキュー(Queue)と同じですが、情報伝送手段としてこれを使っています。
セマフォを使ったスレッド間の通信路スレッド間で情報を転送できるFIFOバッファを、ここではThreadCommunicationBufferと名付けます。 このバッファは複数のスレッドで共有され、かつ生産者・消費者同期も行えるバッファです。 このバッファの構成方法を図2に示します。
このバッファは、「バッファの中にあるメッセージの数」を保持するセマフォ(receive_sema)と、 「バッファの空き数」を保持するセマフォ(send_sema)の二つを用意し、生産者・消費者同期を行います。 具体的な動作は次のようになります。まず、初期値としてsend_sema=バッファサイズ, receive_sema=0にする。 send関数が実行されたら、まずP(send_sema)を実行してキューにメッセージを投函し、V(receive_sema)を実行する。 receive関数が実行された場合は、まずP(receive_sema)を実行してキューからメッセージを読みだし、V(send_sema)を実行する。 以上の操作をプログラムで示すと、図3のようになります。 ただし、Windowsでプログラムしたので、 P命令をWaitForSingleObject命令; V命令をReleaseSemaphore命令; と表記しました。 (見易くするため、エラー処理は記述してません。)
(図3)send関数とreceive関数 |
|
Copyright © 2004 Multisoft-lab All rights reserved. |