天天看點

用多線程實作生産者與消費者的原理

實驗目的

    通過編寫經典的“生産者-消費者”問題的實驗,進一步熟悉Linux中的多線程程式設計,并且掌握用信号量處理線程間的同步和互斥問題。

實驗内容

   “生産者--消費者”問題描述如下:

   有一個有限緩沖區(這裡用有名管道實作FIFO式緩沖區)和兩個線程:生産者和消費者,它們不停地把産品放入緩沖區和從緩沖區拿走産品。一個生産者在緩沖區滿的時候必須等待,一個消費者在緩沖區空的時候也必須等待。另外,因為緩沖區是臨界資源,是以生産者和消費者之間必須互斥執行。它們之間的關系如下圖1所示:

用多線程實作生産者與消費者的原理

  這裡要求使用有名管道來模拟有限緩沖區,并且使用信号量來解決“生産者---消費者”問題中的同步和互斥問題。

實驗步驟

  (1)   信号量的考慮。這裡使用3個信号量,其中兩個信号量avail和full分别用于解決生産者和消費者之間的同步問題,mutex用于解決這兩個線程之間的互斥問題。其中,avail表示有界緩沖區中的空單元數,初始值為N;full表示有界緩沖區中的非空單元數,初始值為0;mutex是互斥信号量,初始值為1。

  (2)  流程圖如下:

用多線程實作生産者與消費者的原理

  (3)  編寫代碼。本實驗的代碼中采用的有界緩沖區擁有3個單元,每個單元為5位元組。為了盡量展現每個信号量的意義,在程式中生産過程和消費過程是随機(采取0~5s的随機時間間隔)進行的,而且生産者的速度比比消費者的速度平均快兩倍左右(這種關系可以相反)。生産者一次生産一個單元的産品(放入“hello”字元串),消費者一次消費一個單元的産品。

繼續閱讀