執行緒安全佇列的介面檔案如下:
#include
template
class threadsafe_queue ;
push函式
push()函式實現向佇列新增資料的功能。新增資料後,使用std::condition_variable的notify_one通知取資料時被阻塞的執行緒。
void push(t tvalue)
wait_and_pop函式
wait_and_pop()函式實現從佇列取資料的功能,當佇列為空時,執行緒被掛起,等待有資料時被喚醒。
注意,這兩個函式中沒有使用std::lock_guard,程式設計客棧而是使用std::unique_lock,這是為什麼呢?
這是因為std::condition_variable的wait函式會首先檢測條件data_queue.empty()是否滿足,如果佇列為空,wait函式會釋放mutex,並被掛起;當有新的資料進入佇列,std::condition_variable的wait函式會被喚醒,重新嘗試獲取mutex,然後檢測佇列是否為空,如果佇列非空,則繼續向下執行。由於函式的執行過程存在鎖的釋放和重新獲取,所以沒有使用std::lock_guard,而是選擇了std::unique_lock。
void wait_and_pop(t& value) );
value=data_queue.front();
data_queue.pop();
}std::shared_ptr wait_and_pop() );
std::shared_ptr res(std::make_shared(data_queue.front()));
data_queue.pop();
return res;
}try_pop函式
try_pop函式提供非阻塞呼叫下的彈出佇列(queue)的功能。彈出成功返回true或者非空shared_ptr,失敗則返回false或者nullptr。
bool try_pop(t& value)
value = data_queue.front();
data_queue.pop();
return true;
}std::shared_ptr try_pop()
std::shared_ptr res(std::make_shared(data_queue.front()));
data_queue.pop();
return res;
}empty函式
bool empty() const
這裡注意,empty()是const型別的成員函式,表明它宣告自己並不改變任何成員變數,但是m lock是一個mutating opertation,所以必須要將mut宣告為mutable型別(mutable std::mutex mut)。
完整**如下:
#include
#include
#include
#include
template
class threadsafe_queue
threadsafe_queue(threadsafe_queue const& other)
void push(t new_value)
void wait_and_pop(t& value) );
value=data_queue.front();
data_queue.pop();
}std::shared_ptr wait_and_pop() );
std::shared_ptr res(std::make_shared(data_queue.front()));
data_queue.pop();
return res;
}bool try_pop(t& value)
std::shared_ptr try_pop()
bool empty() const
};
C 多執行緒程式設計 執行緒同步
前言 多執行緒程式設計必須要考慮執行緒同步問題。執行緒同步就是,當多個執行緒共享一個記憶體的時候,為了保證他們都有一致的資料檢視。如果每個執行緒使用的變數都是其他執行緒不會讀取和修改的,那麼就不存在一致性問題。同樣的,如果變數是隻讀的,多個執行緒同時讀取該變數也不會有一致性問題 但是,當一個執行緒可...
多執行緒程式設計 5種方法實現執行緒同步
1 用interlocked系列函式實現執行緒同步 2 用critical section及其系列函式實現執行緒同步 3 用rtl srwlock及其系列函式實現執行緒同步 4 用事件核心物件實現執行緒同步 5 用訊號量核心物件實現執行緒同步 1 用interlocked系列函式實現執行緒同步例項如...
Java 多執行緒程式設計2 執行緒的狀態
要想實現多執行緒,必須在主執行緒中建立新的執行緒物件,任何執行緒一般有5中狀態,即 建立,就緒,執行,阻塞,終止這五種。執行緒的狀態的轉移和方法之間的關係如下圖所示。在程式中用構造方法建立一個執行緒物件後,新的執行緒物件就處於新建狀態了。此時,它已經有了相應的記憶體空間和其他資源,但還處於不可執行的...
多執行緒 如何實現多個執行緒交替列印字串
編寫一個可以從 1 到 n 輸出代表這個數字的字串的程式,但是 如果這個數字可以被 3 整除,輸出 fizz 如果這個數字可以被 5 整除,輸出 buzz 如果這個數字可以同時被 3 和 5 整除,輸出 fizzbuzz 例如,當 n 15,輸出 1,2,fizz,4,buzz,fizz,7,8,f...
如何實現多執行緒
對於單核cpu來說,某一時刻只能有一個執行緒在執行,但在巨集觀上我們會看到多個程序在執行,這就是微觀序列,巨集觀上並行。現在單核的電腦基本上已經沒有了。多核的電腦就可以實現微觀並行。多執行緒程式設計就是為了最大限度的利用cpu資源。例如當某一個執行緒和外設打交道時,此時它不需要用到cpu資源,但它仍...
如何實現多執行緒
對於單核cpu來說,某一時刻只能有一個執行緒在執行,但在巨集觀上我們會看到多個程序在執行,這就是微觀序列,巨集觀上並行。現在單核的電腦基本上已經沒有了。多核的電腦就可以實現微觀並行。多執行緒程式設計就是為了最大限度的利用cpu資源。例如當某一個執行緒和外設打交道時,此時它不需要用到cpu資源,但它仍...
C 多執行緒程式設計
一個程序通常定義為程式的一個例項。在win32中,程序佔據4gb的地址空間。與它們在ms dos和16位windows作業系統中不同,win32程序是沒有活力的。這就是說,一個win32程序並不執行什麼指令,它只是佔據著4gb的地址空間,此空間中有應用程式exe檔案的 和資料。exe需要的任意dll...
c 多執行緒程式設計
net 基礎類庫的system.threading名稱空間提供了大量的類和介面支援多執行緒。這個名稱空間有很多的類。system.threading.thread類是建立並控制執行緒,設定其優先順序並獲取其狀態最為常用的類。他有很多的方法,在這裡我們將就比較常用和重要的方法做一下介紹 thread....
C 多執行緒程式設計
c 多執行緒程式設計 一 使用執行緒的理由 1 可以使用執行緒將 同其他 隔離,提高應用程式的可靠性。2 可以使用執行緒來簡化編碼。3 可以使用執行緒來實現併發執行。二 基本知識 1 程序與執行緒 程序作為作業系統執行程式的基本單位,擁有應用程式的資源,程序包含執行緒,程序的資源被執行緒共享,執行緒...
C 多執行緒程式設計
對全域性資料執行緒同步 ifndef thread h define thread h include class thread virtual thread private thread const thread static void threadproc void pthread t ntid...