(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,序列...