C 的執行緒安全的佇列

2021-08-23 14:15:36 字數 1690 閱讀 3165

(1)這個實現要求構建工具支援c++11的atomic mutex condition_veriable功能。這是c++11的基礎特性,一般2023年以後的c++編譯器都能支援。 例如,visual studio 2012以上。

(2)這個類的實現中有兩處使用了unique_lock而不是lock_guard,這是data_cond.wait所需要的,unique_lock是lock_guard的增強版。

通過std::move的使用(前提是我們實現的型別t定義了移動建構函式和移動賦值函式),能利用移動語義帶來的效能優勢。

使用shared_ptr返回元素,使用者無需釋放元素的記憶體。

#include #include #include #include #include #include using namespace std;

templateclass threadsafe_queue

~threadsafe_queue(void)

//(1)沒有呼叫termination時,每呼叫一次出隊乙個元素,直到隊列為空本方法阻塞執行緒。

//(2)在呼叫了termination後,本方法永不阻塞,如果原本已經處於阻塞狀態,接觸阻塞狀態。

//(3)返回true時,value值有效。返回false時,value值無效。呼叫了termination且隊列為空時返回false.

bool wait_and_pop(t& value)

); //不為空則出隊

if (!data_queue.empty())

//隊列為空則返回失敗

return false;

} //隊列為空返回false

bool try_pop(t& value)

value = move(*data_queue.front());

data_queue.pop();

return true;

} std::shared_ptrwait_and_pop()

); if (!data_queue.empty())

return nullptr;

} //隊列為空返回null

std::shared_ptrtry_pop()

shared_ptrres = data_queue.front();

data_queue.pop();

return res;

} //插入一項

void push(t new_value)

shared_ptrdata(make_shared(move(new_value)));

lock_guardlk(mut);

data_queue.push(data);

data_cond.notify_one();

} bool empty()

int size()

//設定隊列為退出狀態。在退出狀態下,忽略入隊,可以執行出隊,但當隊列為空時,wait_and_pop不會阻塞。

void termination()

//是退出狀態嗎

bool is_termination()

private:

mutex mut;

queue> data_queue;

condition_variable data_cond;

atomicm_btermination;

};

執行緒安全的佇列 阻塞佇列

queue佇列 先進先出,兩個執行緒同時操作同乙個佇列,執行緒是不安全的 blockingqueue阻塞佇列 先進先出,執行緒是安全,阻塞佇列中維護了鎖,用於進出佇列。一般阻塞佇列用於生產者和消費者模式。arrayblockingqueue 1 基於陣列的阻塞佇列。2 維護的是定長陣列,初始化的時候...

執行緒安全的佇列寫法

首先,互斥量這種執行緒相關的內容是平台相關的,我假設你用的是windows平台開發。其次,說明一下我的開發環境,vs2008,控制台程式,空的工程。最後給你貼 分檔案來看。標頭檔案queuenode.h 你需要的節點資料可能不是整數,只要將typedef int queuedata這一句的int換成...

常用執行緒安全的佇列

參考 執行緒安全佇列可以分為,阻塞執行緒安全佇列和非阻塞執行緒安全佇列 阻塞執行緒安全佇列常用為arrayblockingqueue linkedblockingqueue 非阻塞執行緒安全佇列一般為concurrentlinkedqueue 將不需要序列化的屬性前新增關鍵字transient,序列...