2012-06-21 105 views
0

哪個更好或更快,A或B?一個寫操作和一個讀操作:使用一個wrlock兩個vs一個rdlock讀操作和一個wrlock寫操作?

std::deque<Myclass> queue; 
... // do something 
std::size_t size = 0; 
... // create n threads, one push queue and others pop queue. 

// a thread do below 
#ifdef A 
pthread_rwlock_wrlock(&rwlock); 
queue.push_front(myobj); 
size = queue.size(); 
pthread_rwlock_unlock(&rwlock); 
#endif 

#ifdef B 
pthread_rwlock_wrlock(&rwlock); 
queue.push_front(myobj); 
pthread_rwlock_unlock(&rwlock); 
// if there is some operation, 
// I think this B is better, 
// because I should get the newest size. 
pthread_rwlock_rdlock(&rwlock); 
size = queue.size(); 
pthread_rwlock_unlock(&rwlock); 
#endif 

// other threads do below 
pthread_rwlock_wrlock(&rwlock); 
queue.pop_back(); 
pthread_rwlock_unlock(&rwlock); 

這是我的不理解。

的任何資料或意見是很大的幫助我!

爲我可憐的英語道歉!

回答

0

一個版本速度更快,因爲你需要獲取鎖只有一次(你需要無論如何,一旦獲取寫入鎖定)。此外,返回的尺寸將是最新(在的時間),因爲沒有其他線程可以同時訪問隊列。

如果你,你可能會得到大小不同的答案(如你注意到),但是,一旦你釋放鎖(在任何情況下)的size變量總是能夠容納陳舊值(線程可以通過要使用size值)

而且,讀者應查詢的隊列,它的大小(受保護的段內),以避免異常的時間已經更新了隊列,如果隊列爲空

+0

謝謝。我從你有用的答案中得到了一些信息:1.「獲得鎖定」是很重的(也許是它的spinlock包裝的系統調用?)對幾個流行或推動?沒有實際的環境,沒有人會更好?關於STL,我很奇怪,爲什麼不直接使用std :: deque :: size()而不加鎖(它可能就是{return std :: dequeue :: inner_var_length;},是嗎?)其實,我正在寫一個線程池,任何鏈接或建議?再次感謝。 – HenryLee

+0

@HenryLee - 訪問存儲器位置爲在帶螺紋的環境下,以相同的存儲位置的寫入,可以通過其他線程讀取經常是未定義的行爲(雖然它取決於所使用的線程存儲器模型) – Attila

+0

明白了。謝謝。 – HenryLee

相關問題