在2线程情况下,使用条件变量和互斥锁或仅使用互斥锁是否更好?

时间:2013-08-05 16:49:48

标签: multithreading posix mutex

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

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

}

1 个答案:

答案 0 :(得分:1)

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

但是,如果你做了一些花了一些时间的事情,那么第二个会更合适,除非你确定k在发生任何事情之前必须达到100。

在现实生活中,你不太可能知道在等待时等待的线程会做什么。在这种情况下,无需占用第二个线程中的所有CPU时间。不时地解决问题,因此CPU共享的粒度更小。这在线程1与某种GUI事件处理相关联的情况下也很有用。