boost 多執行緒程式設計 二

2021-08-20 16:49:50 字數 1913 閱讀 3800

一.互斥量的介紹

1. 互斥量主要是用於執行緒間的同步,在多執行緒中主要是防止多個執行緒同時操作共享資源。

2.互斥的基本原則是,一旦某乙個執行緒擁有互斥變數的所有權,操作共享的資源時,那麼其他的執行緒就處於等待中,等待這個互斥量的所有權,一旦擁有所有權的執行緒釋放互斥變數時,其他的執行緒才能取得互斥變數的所有權。

3.互斥量分為兩種:獨佔式和共享式,互斥變數mutex的物件類大致如下:

(1).mutex,獨佔式互斥量,最簡單的,而且是最常用的一種互斥變數。

(2).timed_mutex ,獨佔式互斥量,並提供超時鎖定功能。

(3).recursive_mutex: 遞迴式互斥量,可以多次鎖定,相應地也要多次解鎖。

(4).recursive_timed_mutex: 它也是遞迴式互斥量,提供超時鎖定功能。

(5).shared_mutex: multiple-reader/single-writer 型的共享互斥量(又稱讀寫鎖)。

二.下面來看個簡單的例子:

#include #include using namespace std;

boost::mutex mutex; //定義乙個鎖

void wait(int seconds)

void thread() }

int main()

由於cout列印是執行緒非安全的,所以cout 列印在多執行緒中存在著資源的競爭性,多執行緒使用時需要加鎖。另外,上鎖操作完資源後,需要記得釋放鎖。程式執行的最後結果如下:

三.lock模板類使用

lock模板類也分為獨佔式的 和共享式的。lock模板類與mutex物件結合使用,在lock建構函式中呼叫互斥體mutex的lock方法,mutex物件 被鎖住,一旦離開作用域,會自動呼叫lock的析構函式,釋放鎖。

(1).boost::unique_lock,其中t可以mutex中的任意一種。(獨佔式),如:

boost::unique_lock,構造與析構時則分別自動呼叫lock和unlock方法,不需要手動的釋放鎖。

(2).boost::shared_lock,其中的t只能是shared_mutex類。(共享鎖)

四.下面以讀寫鎖來舉個例子

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

boost::shared_mutex mutex_;//共享鎖

boost::mutex g_io_mutex;

void wait(int seconds)

class counter

size_t get() const

void put() //同一時間 只能有乙個執行緒來訪問

private:

size_t value_;

};void threadfunc(counter& counter)

}int main()

threads.join_all();

return 0;

}

上例子中使用共享鎖物件boost::shared_mutex,在寫入資料時,mutex鎖住 只能有乙個執行緒可以寫入資料,讀取資料的時候,多個執行緒可以同時讀取資料。在讀取的時候,會阻塞所有企圖寫入資料的執行緒,知道所有的讀取資料的執行緒訪問結束,析構lock物件,釋放鎖時,才能獲取到mutex的物件所有權。同理,在寫入資料的時候,會阻塞任意乙個企圖寫和企圖讀資料的執行緒。

程式的執行結果如下:

boost多執行緒程式設計 一

一.thread執行緒的建立 1.執行緒就是在程序空間中執行的乙個函式 2.執行緒建立時需要傳遞給thread物件乙個函式物件或函式 3.傳遞的函式有引數時,可以直接傳遞給thread物件,並在呼叫時候發生拷貝。二.下面我們來看個簡單的例子 include include include void ...

boost併發程式設計 多執行緒

原子操作,基本都包含我們三個方面所關心的語義 操作本身是不可分割的 atomicity 乙個執行緒對某個資料的操作何時對另外乙個執行緒可見 visibility 執行的順序是否可以被重排 ordering include include include using namespace std usi...

boost多執行緒

linux下編譯多執行緒程式 g o 1.out 1.cpp i boost include l boost lib lboost thread 建立執行緒 標頭檔案 namespace boost thread 構造乙個表示當前執行執行緒的執行緒物件 explicit thread const b...