线程阻塞比等待更好吗?有区别吗?
场景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);
}
}
答案 0 :(得分:1)
在这种情况下,它并不重要,因为将k
计为100需要这么短的时间。
但是,如果你做了一些花了一些时间的事情,那么第二个会更合适,除非你确定k
在发生任何事情之前必须达到100。
在现实生活中,你不太可能知道在等待时等待的线程会做什么。在这种情况下,无需占用第二个线程中的所有CPU时间。不时地解决问题,因此CPU共享的粒度更小。这在线程1与某种GUI事件处理相关联的情况下也很有用。