在两个线程的情况下,有一个条件变量和一个互斥对象更好吗



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

场景1只是让线程2占用全局变量k,直到它完成为止。场景2更像是一个有2个以上线程的真实多线程场景。

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

在这种情况下,这并不重要,因为将k计数到100需要很短的时间。

然而,如果你正在做一些需要一些时间的事情,那么第二个会更合适,除非你确信k必须达到100才能发生任何事情。

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

最新更新