c 訊息佇列實現

2021-09-27 11:51:10 字數 1579 閱讀 2224

我們經常用到訊息佇列,把一些資料交給後台執行緒去處理,而直接使用mutex來lock(),unlock()判斷佇列是否為空,會使後台執行緒長時間處於滿載狀態,或者手動sleep()一段時間,造成使訊息處理不及時,所以我們需要實現乙個訊息佇列來實現資料線程的合理使用。

有時任務不是乙個,而是很多個連續的資料,僅僅用到mutex和一些其他執行緒同步方式不能解決問題,需要非同步處理的訊息或者資料,這時就可以用訊息佇列來儲存資訊

我們使用的訊息佇列關鍵在於std::condition_variable條件變數的通知處理

一、介面

訊息佇列的介面包括

send函式,傳送資料,立即返回,不阻塞

receive函式,阻塞,可以傳入超時時間,或者為0時一直阻塞

tryreceive函式,立即返回,不阻塞,當獲取資料成功是返回ture否則返回false。

二、具體實現如下:

#pragma once

#include #include namespace information

~message()

// 傳送訊息函式

void send(t t)

// 接收訊息函式,阻塞

bool receive(t &t, int ms_out_time = 0));}

else);}

if (_buff.size() > 0)

return false;

}// 嘗試接收訊息函式,不阻塞

bool try_receive(t &t)

return false;

}std::queue_buff;

std::mutex _lock_buff;

std::condition_variable _cv;

bool _is_run;};}

test.cpp

#pragma once

#include "message.h"

#include #include namespace information

);

for (int i = 0; i < 10; i++)

_message->send(-1);

t.join();

}void run_thread()

std::cout << data << std::endl;}}

}bool _is_run;

message*_message;};}

執行結果:

三、總結

我們std::queue_buff;佇列使用的是值而不是指標,所以會產生一次值拷貝

當需要傳送的資料非常大時,會降低效率

所以我們可以考慮用指標來實現,同時實用pool記憶體池技術,在send前pop乙個指標

recevie處理完成後,push改指標,減少拷貝次數。

C 後台非同步訊息佇列實現

基於生產者消費者模式,我們可以開發出線程安全的非同步訊息佇列。什麼是生產者消費者模式?為了方便理解,我們暫時將它理解為垃圾的產生到結束的過程。簡單來說,多住戶產生垃圾 生產者 將垃圾投遞到全小區唯一乙個垃圾桶 單佇列 環衛將垃圾桶中的垃圾進行處理 消費者 就是乙個生產者消費者模式。這種模式的好處,就...

php 實現訊息佇列

在做傳送郵件系統時,因為傳送大量郵件很費時間,提出方案是採用佇列的方式 php中可以用memcache memecached來實現訊息佇列。php memcache 訊息佇列類 class qmc return mc mc 計數器,增加計數並返回新的計數 param string key 計數器 p...

redis實現訊息佇列

用redis實現乙個訊息通知系統,總結了一下技術細節,其中演示 如果沒有特殊說明,使用的都是phpredis擴充套件來實現的。記憶體 比如要推送一條全域性訊息,如果真的給所有使用者都推送一遍的話,那麼會占用很大的記憶體,實際上不管粘性有多高的產品,活躍使用者同全部使用者比起來,都會小很多,所以如果只...