単純なメカニズムの 1 つは、10K バッファーの「最高水準点」を共有することです。ファイルを読み取るスレッド (I/O スレッド) は適切な時点でファイルを更新し、「コンシューマー」スレッドがファイルを読み取ります。これはミューテックスによって保護され、I/O スレッドがそれを更新すると、条件変数が通知されます。I/O スレッドのみがその変数 (ミューテックスを保持している間) と 10KB バッファーに書き込むことができます。他のスレッドは (ミューテックスを保持している間) その変数を読み取ることができ、バッファーから読み取ることができます。最高水準点が示すポイント。
非常に大まかな疑似コード (独自のエラー処理、完了のチェック、初期化などを記入):
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;
}
}