linux下c++實現簡單的生產者消費者隊列模式

引言

生產者消費者是一個經典的模式

利用生產者,消費者和緩衝區降低了生產者和消費者之間的的耦合度

便於對生產者和消費者的修改

下面記錄的是一個經典的單一生產者多消費者的模式

設計思路

以隊列做為緩衝區,實現產品的FIFO

生產者調用緩衝區的push函數,將產品加入緩衝區

消費者調用緩衝區的pop函數,將產品從緩衝區取出

因為生產者與消費者分屬於不同的線程,所以要設置鎖

類的聲明

class CacheQueue
{
    private:
        /**
         * @brief 緩衝隊列
         */
        queue<int>* _requests;

        /**
         * @brief 互斥鎖
         **/
        pthread_mutex_t _mutex;

        /**
         * @brief Queue not full conditional object
         **/
        pthread_cond_t _not_full_cond;

        /**
         * @brief Queue not empty conditional object
         **/
        pthread_cond_t _not_empty_cond;

        uint32_t _bufSize;

    public:

        ChacheQueue();

        void SetMaxLength(uint32_t bufSize);
        /**
          * @brief 向隊列添加產品
          * @param [in] req: 待添加的產品
          **/
        void Push(int req);

        /**
          * @brief 從隊列中取出一個產品
          * @param [return] : 從隊列中取出的產品
          **/
        int Pop(uint32_t timeout);

        /**
          * @brief 析構函數
          **/
        ~CacheQueue();
};

重要的函數是Push和Pop,生產者調用Push向緩衝區添加產品,消費者則調用Pop函數獲取產品

線程條件_not_full_cond表示隊列不滿,可以添加產品

線程條件_not_empty_cond表示隊列不空,可以獲取產品

Push函數

void CacheQueue::Push(int req)
{
	/**
	* 上鎖
	*/
    pthread_mutex_lock(&_mutex);

	/**
	* 如果隊列滿,等待信號
	*/
    while (_requests->size() == _bufSize)
    {
        pthread_cond_wait(&_not_full_cond, &_mutex);
    }
    _requests->push(req);

	/**
	* 發送非空信號
	*/
    pthread_cond_signal(&_not_empty_cond);

	/**
	* 解鎖
	*/
    pthread_mutex_unlock(&_mutex);
}

Pop函數

int CacheQueue::Pop(uint32_t timeout)
{
    int ret = 0;
    int req = NO_DATA;
	/**
	* 上鎖
	*/
    pthread_mutex_lock(&_mutex);
	/**
	* 若隊列空等待指定時間
	*/
    struct timeval now;
	struct timespec timepass;
	gettimeofday(&now, NULL);
	timepass.tv_sec = now.tv_sec + timeout;
	timepass.tv_nsec = 0;
    while (ret == 0 && _requests->empty())
    {
		ret = pthread_cond_timedwait(&_not_empty_cond, &_mutex, &timepass);
    }
	/**
	* 沒有數據,返回沒有數據標識
	*/
    if(ret!=0)
    {
        pthread_mutex_unlock(&_mutex);
        return req;
    }
	/**
	* 返回數據,發送隊列非滿信號
	*/
    req = _requests->front();
    _requests->pop();
    pthread_cond_signal(&_not_full_cond);
	/**
	* 解鎖
	*/
    pthread_mutex_unlock(&_mutex);
    return req;
}
时间: 2024-10-11 17:43:05

linux下c++實現簡單的生產者消費者隊列模式的相关文章

字說來簡單當初他卻是費

字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他卻是費字說來簡單當初他

Linux下的文本编辑工具 - vi

Linux下的文本编辑工具 - vi 文本关键字:文本编辑.vi.普通模式.编辑模式.命令模式 一.vi工作模式 由于Linux系统"一切皆配置"的特性,我们经常要去修改各种软件及服务的配置文件,因此掌握最基本的编辑工具是十分必要的.在装了桌面的Linux系统中我们可以使用gedit等工具,像使用记事本一样直接编辑文件中的内容.但是在生产环境中,通常我们都需要远程连接到一台机器,全部要在命令模式下操作,而且服务器本身也有可能没有安装桌面. 普通模式:使用vi命令打开一个文件时默认进入的

使用Mutex實現單一程式執行個體的注意事項(转)

相信大家都知道在.NET程式中若要實現單一程式執行個體,一般來說有幾種方法,像是去判斷是否已經有開啟的Process是相同的程式.用Mutex與Semaphore之類的技術來判斷是否程式正在開啟.但是很多網路上的文章都忽略了在用Mutex實現單一程式執行個體時,其實會有些必須要注意的地方,導致於在實際運用上沒有發揮到該有的效果. 以一個簡單的例子來看,一般我們在網路上常看到的使用方式大概就像下面的程式碼片段類似,建構Mutex時就會回傳該Mutex是否已經存在,利用該回傳值來決定程式應該繼續開啟

【WIN10】移植opencc到WIN10-UWP,實現自己的繁簡轉換工具

花了週末兩天時間,將opencc移植成WIN10-UWP可用的庫,並完成自己的繁簡轉換工具. 我的繁簡轉換工具下載地址為:https://www.microsoft.com/store/apps/9nblggh68g62 移植後的代碼下載地址:http://yunpan.cn/cFiYYCxwTLdfX  访问密码 0533 因為今天(2015-11-1 20:18)才上傳,所以如果你在今天或接下來的兩到三天,是找不到這款軟件的,因為微軟商店在審核.. 來個GIF圖來瞅瞅: 台灣的“軟體”可以轉

在Android中afinal框架下實現sqlite數據庫版本升級的辦法

public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version) 這個方法在實現時需要重寫. public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version) 這個方法在實現時需要重寫. onUpgrade方法會在數據庫需要升級的時候調用.可以用來增刪表或者其他任何操作.如果你想添加新的列你可以使用ALTE

linux下route命令--说的比较清楚!

linux下route命令 route命令感觉很不容易.一般开机后在命令行中使用route命令,会得到下面的信息 Kernel IP routing table Destination     Gateway         Genmask         Flags Metric Ref    Use Iface 192.168.100.0   *               255.255.255.0   U     0      0        0 eth0 link-local    

【转】簡單講講 USB Human Interface Device

原地址http://213style.blogspot.com/2013/09/usb-human-interface-device.html 恩,發本文的原因是看到了以前畢業的朋友在旁邊的對話框問了一些問題,我想這些問題 不是三言兩語可以解釋完畢,但是我也不想又太細究 HID 內部描述表格的解說與視窗上 HID APIs 家族詳細使用方法,主要以偏向解決問題與實作面上的一些重點,希望可以有些 許幫助,因為詳細的文獻找 USB Complete: The Developer's Guide fo

那些年我們未實現的夢

昨天晚飯之後和大學同學在西門町紅樓後面的酒吧聊了很多,聊了過去,現在,當然也不斷地在弄清我們的未來. “清華北大” 這是我的第一個夢想吧,可能大多數中國的學生的夢想,但是能去的人才有幾個呢.特別是在小城市,每年也就三四個考上清華和北大的.大我兩歲的表哥還是我們市歷史上第一個報送到清華的學生,而下一個這麼多年過去也一直沒有.我不算是很努力的學生,但是覺得自己有點小聰明,也沒有像別人題海戰術,基本上就是把老師上課的內容搞明白,時常溫故而知新.從高一開始的年級400多名,經過一年努力,逐步穩定在二十名

Linux 下編輯 PDF 檔的工具(PDF editor under Linux)(转载)

转自:http://www.gtwang.org/2011/05/linux-pdf.html PDF 檔雖然是一個跨平台的檔案格式,但 Adobe 只有提供免費的 Adobe Reader,要看 PDF 檔是沒有問題,但常常我們會需要對 PDF 檔做一些簡單的編輯,光靠 Adobe Reader 就沒有辦法處理,例如取出 PDF 檔中的某幾頁,或是將兩個 PDF 檔合併成一個 PDF 檔等,這些動作雖然簡單,但是 Adobe Reader 卻都沒有提供,有時也是很困擾. 這裡介紹一些在 Lin