2013-08-05 91 views
0

線程阻塞比等待更好嗎?有區別嗎?在2線程的情況下有條件變量和互斥鎖還是隻是互斥鎖更好?

場景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

在這種情況下,它確實沒有太大問題,因爲它需要這樣短的時間來計數k到100

但是,如果你做了一些需要花費一些時間的事情,那麼第二個會更合適,除非你知道,k必須先達到100發生了什麼事

在現實生活中,您不太可能知道等待的線程在等待時會做什麼。在這種情況下,不需要佔用第二個線程中的所有CPU時間。現在可以免費升級,所以CPU共享的粒度更小。在線程1綁定到某種GUI事件處理的情況下,這也很有用。

+0

謝謝李!我同意場景1似乎不現實 – Cal

+0

愛你的名字。 –