生產者和消費者問題

2021-09-30 10:14:11 字數 1094 閱讀 5225

同學面試有遇到這個問題,說面試官很刁,答的不好。於是,我也翻了翻書,頓感有做筆記的必要。

概述

生產者和消費者問題是關於同步的乙個經典問題,即由乙個或多個生產者(執行緒或程序)建立資料,然後由乙個或多個消費者(執行緒或程序)處理。這裡自然涉及到ipc。

一、單生產者、單消費者

最簡單的同步模型,以shell管道為例。

ps -ef | grep in.telnetd
這裡,ps是生產者,grep是消費者,它們的同步方式為:如果生產者超前消費者(即管道被填滿),核心在生產者呼叫寫操作時將其投入睡眠,直到管道中有空餘空間;如果消費者超前生產者(即管道為空),則核心在消費者呼叫讀操作時將其投入睡眠,知道管道中有新的資料為止。這種同步方式完全由核心自行處理,我們稱其隱式同步。

二、多生產者、單消費者

此模型一般多見於以共享記憶體作為ipc形式。在這裡,單由核心解決不了問題,需要由我們自行操作各種同步機制,即顯示同步。如圖:

該模型的同步場景有兩種:

a) 所有生產者完成生產工作,消費者才開始消費

此場景下,沒有生產者和消費者之間的同步問題,只需保證生產者不在同一時刻生產同乙個buff資料,這裡可用互斥鎖保證一次只有乙個生產者在生產。

b) 生產者邊生產,消費者邊消費

此場景下,生產者產生資料的同時,消費者就能知道並進行消費,此時,我們必須同步生產者和消費者,以確保消費者只處理由生產者已生產的資料。這裡的同步方式為:當消費者進行消費時,首先對當前生產者加鎖,防止別的生產者進行新的生產工作;然後等待已生產資料,若等到,則進行消費。在這裡有個問題,就是消費者在等待生產者生成資料前,可以選擇輪詢或者投入睡眠。如果需要投入睡眠,可以使用條件變數方案。

對此模型的擴充套件,是將其中共享的buff區用作乙個環繞buff區,可通過使用posix訊號量方案解決。

三、多生產者,多消費者

此模型實質是模型二的擴充套件,可通過posix訊號量解決。(略)

生產者和消費者問題

有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定乙個具有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩衝區中取走產品進行消費,顯然生產者和消費者之間必須保持同步,是即不允許消費者到乙個空的緩衝區中取產品,也不允許生產...

生產者和消費者問題

package 生產者消費者 public class producerconsumertest package 生產者消費者 生產者執行緒,負責生產公共資源 author dream public class producerthread implements runnable override ...

生產者和消費者問題

package com.softeem.lesson22.sync3 public class mobile public intgetnum public void setnum int num package com.softeem.lesson22.sync3 public class sto...