2011-10-22 56 views
-1

我寫了一個類似於以下結構的多線程程序(我省略了互斥和無關代碼),並且在從線程調用時阻止對boost::thread_group.add_thread()的調用。有沒有辦法解決這個問題,所以通話不會阻止?從線程調用add_thread時提升thread_group塊,爲什麼?

boost::thread_group group; 

void threaded_function2() 
{ 
} 

void threaded_function() 
{ 
    if(condition) 
    { 
     boost::thread *t3 = new boost::thread(boost::bind(&threaded_function2)); 
     group.add_thread(t3); // <-- Blocks on this call 
    } 
} 

int main() 
{ 
    boost::thread *t1 = new boost::thread(boost::bind(&threaded_function)); 
    boost::thread *t2 = new boost::thread(boost::bind(&threaded_function)); 
    group.add_thread(t1); 
    group.add_thread(t2); 

    group.join_all(); 
    return 0; 
} 

謝謝大家。

回答

3

糾正我,如果我錯了,但可能發生的情況是,join_all調用在線程被添加之前運行,使得thread_group對象阻塞,直到其他線程被釋放。一種解決方法是在主函數上創建一個互斥鎖,等待threaded_function完成以調用join_all方法。雖然這是糟糕的設計。

+0

這就是發生了什麼,我意識到如果它不起作用,它肯定是一個糟糕的設計,所以我已經將我的設計重構爲更流暢的結構,仍然能夠滿足我的需求。謝謝! – nickb