0

スレッドが待機するよりもブロックする方が良いですか? 違いはありますか?

シナリオ 1 では、スレッド 2 が完了するまでグローバル変数 k を独り占めしています。シナリオ 2 は、3 つ以上のスレッドを使用する、より現実的なマルチスレッド シナリオを示しています。

シナリオ 1:

global_var k = 1;

Thread1() 
{
    //preliminary work

    while (!done) 
    {
    mutex_lock(handshake_k);
    if (100 == k)
        done = true;

    mutex_unlock(handshake_k);
    }

   //continue executing
}


Thread2() {
    //preliminary work
    mutex_lock(handshake_k);
    for (i=0; i <= 100; i++)
        ++k; ;
    mutex_unlock(handshake_k);
}

シナリオ 2:

global_var k = 1;

Thread1()
{
    //preliminary work
    while (!done)
    {
        mutex_lock(handshake_k);
        if (k < 100)
        {
            wait_cv(handshake_monitor_k);   //unlocks handshake_k
            //mutex exclusively locked here
        }

        else
            done = true;

        mutex_unlock(handshake_k);
    }
    //continue executing
}

Thread2()
{
    //preliminary work

    for (i=0; i <= 100; i++)
    {
        mutex_lock(handshake_k);
        ++k; 
        mutex_unlock(handshake_k);
    }

}
4

1 に答える 1

1

kこの場合、 100まで数えるのに非常に短い時間しかかからないため、あまり問題になりません。

ただし、時間がかかる何かを行っている場合は、k何かが起こる前に 100 に到達する必要があることを確実に知っていない限り、2 番目の方が適切です。

実際には、待機中のスレッドが何をしているのかを知ることはほとんどありません。その場合、2 番目のスレッドですべての CPU 時間を占有する必要はありません。ときどき解放して、CPU 共有の粒度を小さくします。これは、スレッド 1 がある種の GUI イベント処理に関連付けられている場合にも役立ちます。

于 2013-08-05T16:58:48.880 に答える