0

线程阻塞比等待更好吗?有区别吗?

场景 1 只是让线程 2 占用全局变量 k 直到它完成。场景 2 呈现了更多具有 2 个以上线程的真实世界多线程场景。

场景一:

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);
}

场景二:

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 需要这么短的时间。

但是,如果您正在做一些需要一些时间的事情,那么 2nd 会更合适,除非您肯定知道k在任何事情发生之前必须达到 100。

在现实生活中,您不太可能知道等待线程在等待时会做什么。在这种情况下,无需占用第二个线程中的所有 CPU 时间。不时释放一些东西,这样 CPU 共享的粒度就更小了。这在线程 1 与某种 GUI 事件处理相关联的情况下也很有用。

于 2013-08-05T16:58:48.880 回答