线程阻塞比等待更好吗?有区别吗?
场景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事件处理中的情况下也很有用。