0

私が取り組んでいるプロジェクトの一部では、未知のサイズのテキスト ファイルから読み取り、データを 10KB のバッファに入れる必要があります。ファイルを 2KB のチャンクでこのバッファに読み込む必要があります。4 つのスレッドを同時に実行する必要があります。最初のスレッドは、今述べた読み取りを行います。

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

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

4

1 に答える 1

0

単純なメカニズムの 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;
    }
}
于 2012-04-24T23:51:02.733 に答える