2013-10-01 127 views
3

我有一個從main創建的生產者和消費者線程。他們正確地表現良好,除了COUT聲明多線程線程切換問題

class myclass{ 
int x; 
// stuff 
} 

void foo1(myclass* ob){ 
setX(ob->x); 
// stuff 
} 

void foo2(myclass* ob){ 

cout << ob->x << endl; // ONLY THIS DOESN'T EXECUTE 

ob->getX(); 
// stuff 
} 

int main(){ 
myclass* ob = new myclass(); 
boost::thread producer_thread(boost::bind(foo1, ob)); 
boost::thread consumer_thread(boost::bind(foo2, ob)); 
// stuff 

producer_thread.join(); 
consumer_thread.join(); 

} 

一切工作正常(包括顯示X,除了COUT showX。怎麼了?

回答

1

你的線程共享的對象,而實際上任何鎖定它在生產者在消費者開始訪問該對象之前並不退出 在boost :: thread consumer_thread(boost :: bind(foo2,ob))之前使用producer_thread.join()應該可以解決這個問題,這不是最好的解決方法。鎖將是理想的

1

添加到以前的答案,你也可以使用st吃變量或條件變量,以確保當某個其他線程正在處理它時,線程不會寫入/處理您的對象。換句話說,你可以有一個狀態變量,它的值在每個函數完成時被改變爲一個唯一的數字,當狀態變量假定前一個函數應該設置的值時,每個函數都會開始操作。