C 多執行緒的資料保護機制

2021-07-10 01:18:30 字數 1319 閱讀 1041

c++ 多執行緒的資料保護機制

同許多執行緒api一樣,c++0x用互斥來保護共享資料。有四種互斥型別:

non-recursive (std::mutex)

recursive (std::recursive_mutex)

允許鎖超時的non-recursive (std::timed_mutex)

允許鎖超時的recursive (std::recursive_timed_mutex)

如果你試圖在乙個執行緒上鎖(lock)乙個non-recursive mutex兩次而當中沒有unlock它的話,會產生未知結果。遞迴recur6sive mutex只是增加鎖的計數,因此必須確保你unlock和lock的次數相同,其他執行緒才可能鎖這個mutex。

通常我們用模板類 std::unique_lock<>和std::lock_guard<>來 lock和unlock乙個mutex。這些類在建構函式中lock乙個mutex,在析構函式中unlock它。因此,如果你用的是區域性變數,你的 mutex會在退出作用域時自動被unlock。

std::mutex m;

my_class data;

void foo()

// mutex unlocked here

std::lock_guard只 能像上面這樣使用。而std::unique_lock允許延遲lock、設定超時,以及在物件銷毀之前unlock。如果你選擇 std::timed_mutex來設定鎖超時的話,那需要使用std::unique_lock:

std::timed_mutex m;

my_class data;

void foo()

// mutex unlocked here

由於這些lock類是模板,因此他們可以用於所有標準的mutex型別,以及提 供了lock()和unlock()函式的擴充套件型別。

避免死鎖

有時候,我們需要鎖多個mutex。如果控制不力,可 能導致死鎖(deadlock):兩個執行緒都試圖鎖相同的mutex,每個執行緒都鎖住乙個mutex,而等待另外乙個執行緒釋放其他的mutex。 c++0x考慮到了這個問題,你可以使用std::lock函式來一次鎖住多個mutex,而不必冒著死鎖的危險來乙個乙個地鎖:

struct x

;void foo(x& a,x& b)

在上面的例子中,如果你不使用std::lock的話,將很可能導致死鎖(如乙個執行緒執行 foo(x,y), 另乙個執行foo(y,x))。加上std::lock後,則是安全的。

**

多執行緒的資料共享保護案例

假設有乙個網路遊戲伺服器,建立了兩個執行緒 乙個執行緒收集玩家命令 數字表示 並把命令資料寫到佇列中 取出佇列中玩家傳送的命令並進行解析,最後執行玩家需要的動作。用成員函式作為執行緒函式 class a bool isoutmsgrecvqueue int command m mutex.unloc...

C 的多執行緒機制探索

c 的多執行緒機制探索 與threadpool類不同,timer類的作用是設定乙個定時器,定時執行使用者指定的函式,而這個函式的傳遞是靠另外乙個 物件timercallback,它必須在建立timer物件時就指定,並且不能更改。定時器啟動後,系統將自動建立乙個新的執行緒,並且在這個執行緒裡執行使用者...

Linux下多執行緒的執行緒保護

目錄 一 開發環境 二 互斥鎖 系統 ubuntu16.04 執行緒庫 pthread 語言 c c linux下的執行緒保護,最常用的是互斥鎖 條件變數 訊號量和讀寫鎖。先來試一下互斥鎖吧 多執行緒之間可能需要互斥的訪問一些全域性變數,這就需要互斥的來訪問,這些需要共享訪問的字段被稱作是臨界資源,...