c 併發初步學習(2)

2021-08-02 12:00:14 字數 964 閱讀 5183

在c++中,通過構造std::mutex的例項來建立互斥元,呼叫成員函式lock()來鎖定他,呼叫unlock()來進行解鎖。不過直接呼叫成員函式是不推薦的做法,因為這意味著你必須記住在每條可能離開函式(即執行緒)的**路徑上提供std::unlock(),包括由於異常所導致在內的。作為替代,c++提供了std::lock_guard類模板,實現了raii慣用方法;它在建構函式時鎖定互斥元,在析構是解鎖互斥元,從而保證被鎖定的互斥元始終被鎖定和解鎖。

然而,用互斥元保護資料並不只是像在每個成員函式中拍進乙個std::lock_guard物件那樣容易,乙個迷路的指標或者引用,所有的保護都將白費。如下面的例項那樣意外的傳出對受保護資料的引用:

class some_data;};

some_data* unprotected;

void malicious_function(some_data& protected_data)

void foo(){

x.process_data(malicious_function);

unprotected->do_something();

在上面的例項中,process_data中的**看似無害,受到std::lock_guard很好的保護,但對使用者提供的函式func的呼叫就意味著foo可以傳入malicious_function來繞過保護,然後無需鎖定互斥元即可呼叫do_something()。

從根本上來說,這個**的問題在於他沒有完成你所設定的內容,標記所有訪問該資料結構的**為互斥的。在這個例子中,忽略了foo()中呼叫unprotected->do_something()的**。不幸的是,這部分**不是c++執行緒庫所能幫助你的,而是取決於作為程式設計師的我們,去鎖定正確的互斥元來保護你的資料。你有乙個可遵循的準則:不要講對受保護資料的指標和引用傳遞到鎖的範圍之外,無論是通過函式中返回他們、將其存放在外部可見的記憶體中,還是作為引數傳遞給使用者提供的函式。

c 初步學習

其實.net就是乙個開發平台,c 是在這個平台之上進行開發的,下圖是.net的框架 clr 公共語言執行時 cls 公共語言規範 cts 通用型別系統 我們可以從以下幾方面來展開學習 變數的命名規則 1 必須以字母或 符號開頭,不能以數字開頭 2 後面可以跟任意字母 數字 下劃線 3 不能用關鍵字 ...

C 初步學習

這學期有了c 開發這門課.先做了計算器,還有進製轉換,別人看來似乎很強,其實在acm中算是兩個簡單的水題了.參加競賽一年下來,發現學到的演算法和資料結構都是十分有用的東西。計算器最核心的其實就是中綴表示式轉字尾表示式,這就是hdu上的那題 簡單計算器 再加上開發工具做一下介面,套上之前的ac 就直接...

c 多執行緒併發學習筆記 2

等待乙個時間或其他條件 在乙個執行緒等待完成任務時,會有很多選擇 1.它可以持續的檢查共享資料標誌 用於做保護工作的互斥量 直到另乙個執行緒完成工作時對這個標誌進行重設。缺點 資源浪費,開銷大 2.在等待執行緒的檢查間隙,使用std this thread sleep for 進行週期性的間歇。缺點...