PA中的生產(chǎn)者和消費(fèi)者
生產(chǎn)者—消費(fèi)者問題是相互合作的線程關(guān)系的一種抽象,例如在數(shù)據(jù)組包時,DSP,F(xiàn)PGA線程是生產(chǎn)者,打包線程是消費(fèi)者;而在數(shù)據(jù)顯示時,則打包線程是生產(chǎn)者,顯示線程是消費(fèi)者。因此該問題有很大的代表性及實(shí)用價值。
下面我們就以PA8000中的數(shù)據(jù)組包過程中遇到的生產(chǎn)者—消費(fèi)者問題簡單介紹這個多線程同步問題。下圖是三個線程之間的關(guān)系:
1、DSP線程
從DSP共享內(nèi)存區(qū)讀取數(shù)據(jù)分包放入倉庫,如果緩沖區(qū)滿則等待。
2、 FPGA線程
從FPGA共享內(nèi)存區(qū)讀取數(shù)據(jù)分包放入倉庫,如果緩沖區(qū)滿則等待。
3、數(shù)據(jù)打包線程
從緩沖區(qū)中取出分包,根據(jù)同步ID組裝成一個完整包,如果緩沖區(qū)空則等待。
假定在生產(chǎn)者和消費(fèi)者之間的公用緩沖池中,具有n個緩沖區(qū),這時可以使用互斥信號量mutex實(shí)現(xiàn)諸線程對緩沖池的互斥使用;利用計(jì)數(shù)信號量empty和full分別表示緩沖池中空緩沖區(qū)和滿緩沖區(qū)的數(shù)量。又假定這些生產(chǎn)者和消費(fèi)者相互等效,只要緩沖池未滿,生產(chǎn)者便可將數(shù)據(jù)分包送入緩沖池;只要緩沖池未空,消費(fèi)者便可從緩沖池中取走一個分包,對生產(chǎn)者—消費(fèi)者問題解決方案可描述如下圖:
在生產(chǎn)者—消費(fèi)者問題中應(yīng)注意:首先,在每個線程中用于實(shí)現(xiàn)互斥的wait(mutex)和signal(mutex)必須成對地出現(xiàn);其次,對計(jì)數(shù)信號量empty和full的wait和signal操作,同樣需要成對地出現(xiàn),但他們分別處于不同的線程中。例如wait(empty)在DSP線程中,而signal(empty)則在數(shù)據(jù)打包線程中,DSP線程若因wait(empty)而阻塞,則以后將由數(shù)據(jù)打包線程將它喚醒;最后,在每個線程中的多個wait操作順序不能顛倒,應(yīng)先執(zhí)行對計(jì)數(shù)信號量的wait操作,然后再執(zhí)行對互斥信號量的wait操作,否則可能引起線程死鎖。