2012-04-24 11 views
0

私が取り組んでいるプロジェクトの一部では、未知のサイズのテキストファイルから読み込み、10KBバッファにデータを格納する必要があります。私は2KBのチャンクでこのバッファにファイルを読み込まなければなりません。私は同時に4つのスレッドを実行する必要があります。最初のスレッドは、私が言及した読書を行います。Cでのバッファとマルチスレッドを使用したテキストファイルからの読み取り

スレッドがバッファにデータの2キロバイトチャンクに読んでいるように、他の3つのスレッドは、リーダによって読み込ま2キロバイトのチャンクを取得し、その上にいくつかの計算を行います。これらのスレッドが完了すると、次の2KBチャンクを取得して同じ計算を行います。これはテキストファイル全体が読み込まれるまで繰り返されます。

誰でも私にこのプロジェクトのこの部分をどのように進めるかについての指導を与えることができますか?私はマルチスレッドの方法を知っています。それは以前経験したことのないマルチスレッドとI/Oの組み合わせです。私は単純なI/Oを前にやっただけです。

+0

あなたが条件変数に精通している「私はマルチスレッドにする方法を知っている」と言いますか? –

+1

3つのスレッドはそれぞれ2Kチャンクの1/3で独立して動作できますか?もしそうでなければ、大きな競争の混乱が起こるだろう。 –

+0

バッファ内のデータを使用する3つのスレッドがデータの読み取りのみを行う場合、競合は発生しません。 –

答えて

0

シンプルなメカニズムの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; 
    } 
} 
関連する問題