0

私はスレッド同期を学習しています。これは、スレッドの実行中に重要なデータをロックする方法を示すデモです。

http://ideone.com/7Do0l (このコードを実行するには-pthread、Linux/MacOS 環境でパラメーターを指定してコンパイルします)

プログラムは期待どおりに動作しますが、sleep()関数はスレッド間の実行を一時停止しません。私の考えは、一度に 1 つのスレッドで計算を行い、1 秒後に別のスレッドが実行されるようにすることです。これが私が戦っているコードセグメントです:

while(1) {
        //sleep(1);     //(1) (Sleep for one second)
        sem_wait(&mutex);
        //sleep(1);     //(2)
                printf("Thread #%d is doing math. %d + 1 = %d.\n", (int) id, s, s+1);
                s++;
        //sleep(1);     //(3)
        sem_post(&mutex);
        //sleep(1);     //(4)
}

私が入れようとした 4 つの位置がありますsleep()。(1) と (4) では、単一のスレッド間では一時停止が発生しませんが、10 スレッドの 2 つの束の間に一時停止が発生します。(2) と (3) は、別のスレッドが呼び出される前に、1 つのスレッドが非常に長い時間繰り返し実行される結果となります。

これに対する救済策はありますか?

アップデート

プログラムに結果を生成させるトリックがあります: 各スレッドのスリープ時間をランダムに生成しますが、2 つの乱数が偶然に同じになる可能性があるため、一貫性がありません。

4

3 に答える 3

0

メッセージ間に 1 秒の遅延が必要なため、3 番目の位置に配置しprintfます。

いずれかのスレッドがクリティカル セクションに入る前にすべてのスレッドを確実に初期化したい場合mainは、リンクされたコードの関数を次のように変更します。

int main() {
    pthread_t thread[10];

    int i;
    sem_init(&mutex, 0, 1);
    sem_wait(&mutex);
    for (i = 0; i<10; ++i)
            pthread_create(&(thread[i]), NULL, job, (void*) i);
    sem_post(&mutex);
    sleep(100);
}
于 2012-08-24T04:42:10.650 に答える
0

これは、スレッドが解決するように設計されている種類の問題ではありません。スレッドごとに個別のセマフォが必要であり、1 つのスレッドがそれらをループし、毎秒別のセマフォで sem_post を呼び出し、残りは sem_wait を呼び出すだけです。1つのスレッドだけを使用することもできます。

于 2012-08-24T05:03:02.717 に答える
0

いくつかの調査を行ったところ、目的の出力を生成する唯一の方法は、更新部分で言及した方法であることがわかりました。つまり、スリープ タイマーをハード コードする代わりに、各スレッドに乱数を与えるだけです。

    // Sleep time in microseconds.
    int st = rand() % 500000;
    usleep(st);

実際、私は 2 つのスレッドが同時に同じことを行っていることを過度に心配していました。隣接する 2 つのランダム タイマーが誤って同じになる可能性がありますが、2 つのスレッドが CPU の同じコアで同時に実行されることはありません。CPU が複数のコアの場合、2 つの命令が同じメモリ コンテンツを同時に変更することはできません。

于 2012-08-24T08:01:39.427 に答える