2013-01-09 164 views
6

考慮以下情況:等待多個線程(POSIX線程,C++)

我有一個是使用由多個線程的對象foo,其可以或可以不重複調用於foo的方法欄()。

bar()並行執行多次是完美的(也是期望的),因爲它永遠不會改變foo的狀態。

當我需要從外部(從另一個線程,而不是從「worker」線程之一)更改foo的狀態時,會出現問題 - 如何鎖定foo以便調用線程阻塞直到最後一個工作線程是用bar()完成的,並且所有工作線程都會在bar()處阻塞,直到我再次釋放foo爲止?

顯然,我不能只使用bar()執行過程中保持鎖定狀態的互斥鎖,因爲那樣我就沒有併發性了。

任何想法?還是有更好的設計來解決這些類型的問題?

+3

請參閱[讀者 - 寫作者鎖定](http://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock) – hmjd

+0

爲什麼不在工作線程中調用bar函數並在其上引入互斥鎖也在想要改變foos狀態的調用線程上。調用線程鎖定互斥鎖,並且可以安全地更改foo的狀態。 – mgr

+2

'pthread_rwlock_t'可能會引起您的興趣。 – WhozCraig

回答

4

我不知道你將如何來實現,即沒有工人的使用FOO讓作家更新它,但如果它是一個關心的問題就用一個read/write mutex工人到獲得讀鎖,寫入器獲得寫鎖)。

但值得一提的是,您可能要考慮製作foo Copy-on-Write。這樣你會使同步開銷接近於零。您可以使用shared_ptr atomically來實現。

+0

感謝pthread_rwlock_t的所有指針! – Pontomedon