0

単一のファイルに書き込み、マルチスレッド環境で動作できるライブラリを構築しようとしています。要件は次のとおりです。

  1. ファイルへの書き込み中に同時実行の問題は発生しません。
  2. スレッドが処理される順序は重要ではありません。
  3. ライブラリは非ブロッキングである必要があります。つまり、書き込み関数とフラッシュ関数は、指定されたバッファが書き込まれる前に戻ります。

これが私がこれまでに持っているものです:

int write2device(char *buffer, int length) {
    Task * task = new Task(id++,buffer,length);
    pthread_t * thread = new pthread_t;
    Argument * arg = new Argument; //A sturct with pthread_t and task fields
    arg->task = task;
    arg->thread = thread;
    pthread_create(thread,NULL,deamonWrite,arg);
    return 0;
}

void wait(Argument * arg) {
    //manager is a singleton class that handles the threads database and related
    //issues
    manager->pushDeamon(arg->thread);
    manager->lock(arg->task->getId()); //mutex - only one thread can write
}

void * deamonWrite(void * arg) {
    Argument * temp = (Argument *) arg;
    wait(temp);
    //critical section
    //will add signal() later
    return NULL;
}

アイデアは、write2deviceを呼び出すすべてのスレッドに対して、deamonWrite()を実行するスレッドを開くというものです。この関数の構造は、wait()->クリティカルセクション-> signal()です。待っている間、他の誰かが書いている場合、私は(まだ行っていない)スレッドを一時停止して、ユーザーが書き込みが完了するまで待たないようにします。

2つの質問があります:

  1. ミューテックス(ロック機能)を実装するにはどうすればよいですか?これはアトミック関数である必要があることを理解しています。ロックを取得しようとする複数のスレッドが混乱を招く可能性があることを感知してください。
  2. 私の一般的な構造は正しいですか?

私は並行性に不慣れであり、この問題についての考えをいただければ幸いです-ありがとう!

4

1 に答える 1

4

構造をキュー/ベクトルにプッシュし、Taskタスクごとに個別に複数のスレッドではなく、単一のスレッドから順番に処理します。ミューテックスが必要になるのは、キューにプッシュしたりキューからプルしたりするときだけです。ベンがコメントで正しく指摘しているように、スレッド同期プリミティブ(ミューテックス、クリティカルセクション)の実装は、OSや使用が許可されているシステムAPIに任せる必要があります。

于 2012-05-05T22:05:27.307 に答える