boost併發程式設計(一)——互斥鎖
這個系列其實是《Boost程式庫完全開發指南》的讀書筆記。按照書中的方法程式碼沒跑起來,所以轉到Ubuntu下學習了。boost庫在Ubuntu下的安裝,直接用apt-get install命令安裝就可以了,需要安裝libboost-dev libboost-system libboost-thread
我們直接上程式碼,通過講解程式碼來學習。一方面,更詳細的內容請參看原書,在此不作重複;另一方面,先把程式碼跑起來比看了半天書連幾行程式碼都執行不起來更能激勵學習。
#include <boost/thread.hpp> #include <boost/thread/mutex.hpp> #include <string> #define BOOST_DATE_TIME_SOURCE #define BOOST_THREAD_NO_LIB using namespace boost; int main() { mutex mu; { mutex:: scoped_lock lock(mu); thread t1(print, std::string("Hello,")); t1.join(); } { mutex:: scoped_lock lock(mu); thread t2(print, std::string("boost!")); t2.join(); } std::cout << std::endl; return 0; }
mutex是最簡單最常用的互斥變數,但如果手工寫程式碼維護互斥鎖的狀態既繁瑣又容易出錯,因此boost庫提供了一系列RAII型的lock_guard類來自動做這些工作。mutex類中的scope_lock類是其中一種,顧名思義,它的類物件根據作用域來解鎖互斥量。在作用域中用一個互斥量來初始化scope_lock物件,互斥量即被鎖定;在離開作用域後,會自動呼叫scope_lock類的解構函式,解鎖互斥量。
thread物件接受一個函式和這個函式的引數作為建構函式的引數來構造執行緒,這個執行緒就負責用相應的引數呼叫指定函式。然後呼叫thread物件的join方法,使主執行緒阻塞直到子執行緒執行完畢,以免主執行緒過早結束時銷燬所有子執行緒使執行緒來不及執行完畢。
就簡單解釋到這裡吧,下回見!
相關推薦
boost併發程式設計(一)——互斥鎖
這個系列其實是《Boost程式庫完全開發指南》的讀書筆記。按照書中的方法程式碼沒跑起來,所以轉到Ubuntu下學習了。boost庫在Ubuntu下的安裝,直接用apt-get install命令安裝就可以了,需要安裝libboost-dev libboost
併發程式設計(一):執行緒基礎、執行緒之間的共享與協作
一、基礎概念 1.1 CPU核心數、執行緒數 **兩者的關係:**cpu的核心數與執行緒數是1:1的關係,例如一個8核的cpu,支援8個執行緒同時執行。但在intel引入超執行緒技術以後,cpu與執行緒數的關係就變成了1:2。此外在開發過程中並沒感覺到執行緒的限制,那是因為cpu
併發程式設計(一)同步類容器和併發類容器
併發程式設計(一)同步類容器和併發類容器 一、同步類容器 同步類容器是 執行緒安全 的,如 Vector、HashTable 等容器的同步功能都是由 Collections.synchronizedMap 等工廠方法去建立實現的,底層使用 synchronized 關鍵字,每次只有一個執行緒訪問容器。這明
併發程式設計(一)—— volatile關鍵字和 atomic包
Java記憶體模型 JMM(java記憶體模型) java虛擬機器有自己的記憶體模型(Java Memory Model,JMM),JMM可以遮蔽掉各種硬體和作業系統的記憶體訪問差異,以實現讓java程式在各種平臺下都能達到一致的記憶體訪問效果
Java併發程式設計(一)Java記憶體模型
目錄 一、原子性、可見性和有序性 二、JMM概念 三、指令重排 四、happens-before規則 一、原子性、可見性和有序性 提到併發程式設計就得搞清楚原子性、可見性、有序性這三大性質,搞不清這三個性質,後面的概念也就很模糊。 1、原子性 概念:一個操作或多個
Java併發程式設計(一)——挑戰
多執行緒一定會讓程式執行更快嗎? 建立執行緒的問題,上下文切換的問題,死鎖的問題,硬體和軟體資源的問題 上下文切換 即使單核的CPU也是支援多執行緒執行程式碼的,CPU給每個執行緒分配時間片來實現這個機制。 時間片是CPU分配給各個執行緒的時間,非常短,所以CPU通過不停的切換執
Java併發程式設計(一)Thread詳解
一、概述 在開始學習Thread之前,我們先來了解一下 執行緒和程序之間的關係: 執行緒(Thread)是程序的一個實體,是CPU排程和分派的基本單位。 執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。 執行緒和程序的關係是:執行
Java粗淺認識-併發程式設計(一)
執行緒簡介 程序,作業系統中分配資源的基本單元,執行緒,作業系統中執行的基本單元,在一個程序中可以包含一個或多個執行緒,程序間通訊,資源共享效率低,在同一個程序中,所有執行緒共享資源。 執行緒在使用時,也存在各種問題,執行緒安全性,執行緒活躍性,執行緒效能 執行緒安全性 在多執行緒環
併發程式設計(一)多執行緒基礎
目錄 併發程式設計(一)多執行緒基礎 1、程序和執行緒的概念 2、為什麼要使用多執行緒 3、多執行緒使用的場景 4、多執行緒建立方式 4.1、繼承Thread類 4.2、實現Runable介面 4.3、匿名內部類 4.4、執行緒池(後面細說)
boost併發程式設計(二)——條件變數
直接貼程式碼吧: class buffer { private: mutex mu, io_mu; condition_variable_any cond_get, cond_put; std::stack<int> stk;
實戰Java高併發程式設計(一)走進併發世界
阻塞(blocking)一個執行緒是阻塞的,那麼其它的執行緒釋放資源之前,當前執行緒無法繼續執行。使用synchronized或者重入鎖會使執行緒這是。 無飢餓(starvation-free):對於非公平的鎖來說,系統允許高優先順序的執行緒插隊,會造成飢餓;而公平的鎖則不會造成飢餓。 無障礙(obstruc
java併發程式設計(一)-從入門到吐血
一:初始原子類 在併發程式設計中,若多個執行緒同時操作同一變數就有問題了,比如: public class Calculate { private int num; public void add() { try {
java併發程式設計(一) 執行緒安全(1)
最近想了解併發程式設計,二執行緒安全是它的基礎。所以看了下java相關的執行緒安全知識。 執行緒安全的核心是程式碼正確性(一般是輸出的結果); 首先無狀態的物件是執行緒安全的;因為一個無狀態的物件即不包含其他域;也沒有對其他域的引用; (1)原子性 原子性:即程式碼不
C++11併發程式設計(一)——初始C++11多執行緒庫
1 前言 C++11標準在標準庫中為多執行緒提供了元件,這意味著使用C++編寫與平臺無關的多執行緒程式成為可能,而C++程式的可移植性也得到了有力的保證。 在之前我們主要使用的多執行緒庫要麼
Java併發程式設計(一)執行緒定義、狀態和屬性
一 、執行緒和程序 1. 什麼是執行緒和程序的區別: 執行緒是指程式在執行過程中,能夠執行程式程式碼的一個執行單元。在java語言中,執行緒有四種狀態:執行 、就緒、掛起和結束。 程序是指一段正在執行的程式。而執行緒有時也被成為輕量級的程序,他是程式執
Java併發程式設計(7):使用synchronized獲取互斥鎖的幾點說明
在併發程式設計中,多執行緒同時併發訪問的資源叫做臨界資源,當多個執行緒同時訪問物件並要求操作相同資源時,分割了原子操作就有可能出現數據的不一致或資料不完整的情況,為避免這種情況的發生,我們會採取同步機制,以確保在某一時刻,方法內只允許有一個執行緒。 採用synchronized修飾符實現的同步機制叫做互斥鎖
Java的高併發程式設計系列(一)synchronized鎖
private int count = 10; public void test(){ synchronized (this) { //任何執行緒要執行下面的程式碼,必須先拿到Demo02物件例項的鎖 count --;
Java併發程式設計實戰(3)- 互斥鎖
我們在這篇文章中主要討論如何使用互斥鎖來解決併發程式設計中的原子性問題。 [toc] # 概述 併發程式設計中的原子性問題的源頭是執行緒切換,那麼禁止執行緒切換可以解決原子性問題嗎? 這需要分情況討論,在單核CPU的情況下,同一時刻只有一個執行緒執行,禁止CPU中斷,就意味著作業系統不會重新排程執行緒,
Java併發程式設計(1):可重入內建鎖
每個Java物件都可以用做一個實現同步的鎖,這些鎖被稱為內建鎖或監視器鎖。執行緒在進入同步程式碼塊之前會自動獲取鎖,並且在退出同步程式碼塊時會自動釋放鎖。獲得內建鎖的唯一途徑就是進入由這個鎖保護的同步程式碼塊或方法。 當某個執行緒請求一個由其他執行緒持有的鎖時,發出請求的執行緒就會阻塞。然而,由於內建鎖是可
Java併發程式設計(9):死鎖(含程式碼)
JAVA大資料中高階架構 2018-11-10 14:04:32當執行緒需要同時持有多個鎖時,有可能產生死鎖。考慮如下情形: 執行緒A當前持有互斥所鎖lock1,執行緒B當前持有互斥鎖lock2。接下來,當執行緒A仍然持有lock1時,它試圖獲取lock2,因為執行緒B正持有lock2,因此執行緒A會阻塞等