シンプルなメカニズムの1つは、10Kバッファ用に "最高水準点"を持つことです。ファイル(I/Oスレッド)を読み取るスレッドは適切なポイントでそれを更新し、 'コンシューマー'スレッドはそれを読み取ります。それはミューテックスによって保護され、I/Oスレッドがそれを更新するとき、それは条件変数を通知するでしょう。その変数(ミューテックスを保持している間)と10KBのバッファに書き込むことができるのはI/Oスレッドだけです。他のスレッドは(mutexを保持して)変数を読み込み、バッファから読み込むことができます。最高水準点によって示される点。
いくつかの非常に大まかな擬似コード(など、初期化の完了をチェックし、独自のエラー処理に記入):
pthread_mutex_t mux;
pthread_cond_var_t valid_bytes_updated;
int g_valid_bytes = 0; // high water mark
char buffer[10 * 1024];
void* io_thread(...)
{
int offset = 0;
while (!done) {
// read the next block of data
readdata(file_handle, &buffer[offset], 2 * 1024);
// let consumer threads know there's more data
offset += 2 * 1024;
pthread_mutex_lock(&mux);
g_valid_bytes = offset;
pthread_mutex_unlock(&mux);
pthread_cond_broadcast(&updated);
}
void* consumer_thread(...)
{
int processed_bytes = 0;
while (!done) {
// wait until there's something to do
pthread_mutex_lock(&mux);
while (processed_bytes == g_valid_bytes) {
pthread_cond_wait(&valid_bytes_updated, &mux);
}
int valid_bytes = g_valid_bytes;
pthread_mutex_unlock(&mux);
// process the data in range &buffer[processed_bytes] to &buffer[valid_bytes],
// keeping in mind that the range is up to but not including the byte at
// &buffer[valid_bytes]
processed_bytes = valid_bytes;
}
}
あなたが条件変数に精通している「私はマルチスレッドにする方法を知っている」と言いますか? –
3つのスレッドはそれぞれ2Kチャンクの1/3で独立して動作できますか?もしそうでなければ、大きな競争の混乱が起こるだろう。 –
バッファ内のデータを使用する3つのスレッドがデータの読み取りのみを行う場合、競合は発生しません。 –