OpenThreads庫的使用 Mutex

2021-07-30 06:56:21 字數 1967 閱讀 7446

mutex,叫互斥鎖。

在程式設計中,引入了物件互斥鎖的概念,來保證共享資料操作的完整性。每個物件都對應於乙個可稱為」 互斥鎖」 的標記,這個標記用來保證在任一時刻,只能有乙個執行緒訪問該物件。

因為執行緒存在併發性,併發容易導致問題。舉個例子:a,b兩個售票員,看到最後還有一張車票。同時,正好有c,d兩個人要買這張車票。那麼這個車票怎麼賣?a認為可以賣給c,b認為可以賣給d。但是最後如果c,d同時買到這張車票,那麼誰來坐這個車票的座位呢?

看看程式中的例子。假設有1000張車票,分別由ticketsellthread1和ticketsellthread2來進行銷售。

#include 

#include

int g_ticketcounts = 1000;

class ticketsellthread : public openthreads::thread

}};int main(int argc, char** argv)

每個執行緒分別銷售500張。那麼到最後,這個車票數量應該為0。但是實際情況呢?

實際最後還剩下12張。你們的電腦上可能情況不一樣,但是最終結果,為乙個隨機值,很大可能不為0。這是怎麼回事?ticketsellthread1和ticketsellthread2都賣了500張,但是最後還剩12張。這中間肯定出現了一張票,賣給2個人的情況。這裡,有12張票賣重複了。

那怎麼避免這種情況呢?我要保證,一張票,在同乙個時間點,只有乙個售票員賣。可以這樣,a售票員在賣出88號票之前,先給88號票上一把鎖。然後b售票員,看到這個88號票,上鎖了,就不賣88號票了。

程式中,上鎖的方式,有好幾種。使用mutex是其中一種方式。

mutex的使用,也比較簡單。定義乙個mutex,然後使用lock函式,進行上鎖,使用unlock函式,進行解鎖。下面程式,在g_ticketcounts–之前,對g_ticketcounts進行上鎖,然後減完之後,進行解鎖。最後執行結果,g_ticketcounts為0,表示所有票正好賣完,沒有重複的了。

但是mutex的使用,一定要記得解鎖,否則會引起各種問題。

比如下面的**,當i==5時,我在lock和unlock之間,丟擲乙個異常,導致執行緒終止,mutex一直沒有執行unlock,一直處於鎖住狀態。程式沒法繼續執行。

virtual

void run()

g_ticketmutex.unlock();

std::cout

<< g_ticketcounts << std::endl;}}

這種情況怎麼辦呢?openthreads提供了乙個叫做範圍鎖的東西,scopedlock。這個類的功能,其實很簡單,在它的建構函式中,呼叫mutex的lock函式,在析構函式中,呼叫mutex的unlock函式。這樣就可以確保mutex的unlock被執行,無論發生了什麼。

virtual

void run()

std::cout

<< g_ticketcounts << std::endl;}}

對應的標頭檔案包含為#include

OpenThreads執行緒庫

openthreads與pthread不同點在於,他是根據物件導向開發的。傳統的 1.互斥量openthreads mutex類 當執行緒使用某一資源時,先使用互斥量加鎖。由於採用了物件導向機制將互斥量抽象為乙個類,所以不像pthread函式那樣傳入個引數。mutext有兩個函式 int mutex...

靜態庫動態庫的使用

首先介紹一下靜態庫 靜態鏈結庫 動態庫 動態鏈結庫 的概念,首先兩者都是 共享的方式。靜態庫 在鏈結步驟中,聯結器將從庫檔案取得所需的 複製到生成的可執行檔案中,這種庫稱為靜態庫,其特點是可執行檔案中包含了庫 的乙份完整拷貝 缺點就是被多次使用就會有多份冗餘拷貝。即靜態庫中的指令都全部被直接包含在最...

Boost thread庫的使用

2009 11 26 kagula 閱讀物件 本文假設讀者有幾下skills 1 在c 中至少使用過一種多執行緒開發庫,有mutex和lock的概念。2 熟悉c 開發,在開發工具中,能夠編譯 設定boost thread庫。1 visual studio 2005 2008 with sp1 2 b...