0

私はセマフォについて読んでいて、この記事に出くわしました:

www.csc.villanova.edu/~mdamian/threads/posixsem.html

したがって、このページでは、同じデータにアクセスする 2 つのスレッドがある場合、事態が悪化する可能性があると述べています。解決策は、同時に 1 つのスレッドのみがデータにアクセスできるようにすることです。

これは明らかであり、私は解決策を理解していますが、これを行うためにスレッドが必要なのはなぜですか? ポイントは?スレッドがブロックされて 1 つのスレッドしか実行できない場合、それらを使用する必要はありません。利点はありません。(または、これは単なるばかげた例かもしれません。そのような場合は、賢明な例を教えてください)

前もって感謝します。

4

5 に答える 5

1

マルチスレッドを使用している場合、実行されるすべてのコードがブロックされるわけではありません。たとえば、キュ​​ーがあり、2 つのスレッドがそのキューから読み取りを行っている場合、キューから同時に読み取りを行うスレッドがないようにします。そのため、その部分はブロックされますが、おそらくより少ない時間。処理する項目をキューから取得したら、残りのすべてのコードを非同期で実行できます。

于 2013-07-11T05:49:54.153 に答える
1

このことを考慮:

void update_shared_variable() {
    sem_wait( &g_shared_variable_mutex );

    g_shared_variable++;

    sem_post( &g_shared_variable_mutex );
}

void thread1() {

    do_thing_1a();
    do_thing_1b();
    do_thing_1c();

    update_shared_variable();   // may block
}

void thread2() {

    do_thing_2a();
    do_thing_2b();
    do_thing_2c();

    update_shared_variable();   // may block
}

do_thing_xxすべての機能が同時に実行されることに注意してください。セマフォは、スレッドが共有 (グローバル) 状態を変更するか、共有リソースを使用する必要がある場合にのみ機能します。したがって、別のスレッドが同時に共有されたものにアクセスしようとしている場合にのみ、スレッドはブロックされます。

ここで、スレッドが行っていることが 1 つの共有変数/リソースを操作することだけである場合、その通りです。スレッドを使用する意味はまったくありません (実際には、コンテキストの切り替えが原因で、スレッドが 1 つだけの場合よりも効率が低下します)。 .)

于 2013-07-11T05:50:59.597 に答える
1

スレッドの背後にある考え方は、同時処理を可能にすることです。共有リソースは、デッドロックや枯渇などを回避するために管理する必要があります。処理に時間がかかる場合は、それらのプロセスの複数のインスタンスを作成して、より迅速に終了できるようにしてみませんか? ボトルネックは、プロセスがI / Oを待機する必要がある場合に、あなたが言及したとおりです。

処理時間に比べて共有リソース待ちでブロックされることが少ないため、マルチスレッドを利用したい場合に利用します。

于 2013-07-11T05:52:33.360 に答える
0

もちろん、これは SSCCE (Short, Self Contained, Correct Example) です。多くの作業を行い、結果をファイルに書き込む 2 つのワーカー スレッドがあるとします。ファイル (共有リソース) アクセスをロックするだけで済みます。

于 2013-07-11T05:50:51.237 に答える