C 中線程類的使用經驗

2021-12-30 00:28:47 字數 2169 閱讀 7024

一.mutex類

msdn簡單描述:

當兩個或更多執行緒需要同時訪問乙個共享資源時,系 統需要使用同步機制來確保 一次只有乙個執行緒使用該資源。mutex是同步基元,它只向乙個執行緒授予對共享資源的獨佔訪問權。如果乙個執行緒獲取了互斥體,則要獲取該互斥體的第二個執行緒將被掛起,直到第乙個執行緒釋放該互斥 體。

可以使用 waithandle.waitone 方法請求互斥體的所屬權。擁有互斥體的執行緒可以在對 waitone 的重複呼叫中請求相同的互斥體而不會阻止其執行。但執行緒必須呼叫 releasemutex 方法同樣多的次數以釋放互斥體的所屬權。mutex類強制執行緒標識,因此互斥體只能由獲得它的執行緒釋放。相反,semaphore 類不強制執行緒標識。

互斥體有兩種型別:區域性互斥體和已命名的系統互斥體。如果使用接受名稱的構 造函式建立mutex物件,則該物件與具有該名稱的作業系統物件關聯。已命名的系統互斥體在整個作業系統中都可見,可用於同步程序活動。您可以建立多個mutex物件來表示同乙個已命名的系統互斥體,也可以使用 openexisting 方法開啟現有的已命名系統互斥 體。

區域性互斥體僅存在於您的 程序內。您的程序中任何引用區域性mutex物件的執行緒都可以使用它。每個mutex物件都是乙個單獨的區域性互斥體。

個人對互斥物件(mutex)的理解:

1. 做不到兩個執行緒互動執行的目的。如果把mutex物件放在了兩個執行緒的迴圈裡,當執行緒執行出了臨界區,兩個執行緒都會馬上去搶互斥物件,所以可能乙個執行緒的迴圈裡可能會多次執行!

例:    for(int i=0;i

在乙個執行緒中這個迴圈可能執行多次

2.它的乙個最大的用處就是上面我標黃的文字所述,可以防止乙個程式建立多個程序。

二、monitor類(或lock鎖)

msdn簡單描述:

monitor類通過向單個執行緒授予物件鎖來控制對物件的訪問。物件鎖提供限制訪問**塊(通常稱為臨界區)的能力。當乙個執行緒擁有物件的鎖時,其他任何執行緒都不能獲取 該鎖。還可以使用monitor來確保不會允許其他任何執行緒訪問正在由鎖的所有者執行的應用程式**節,除非另乙個執行緒正在使用其他的鎖定物件執行該**。

monitor具有以下功能:

將為每個同步物件來維護以下資訊:

下表描述了訪問同步物件的執行緒可以採取的操作:

操作

說明

enter, tryenter

獲 取物件鎖。此操作同樣會標記臨界區的開頭。其他任何執行緒都不能進入臨界區,除非它使用其他鎖定物件執行臨界區中的指令。

wait

釋 放物件上的鎖以便允許其他執行緒鎖定和訪問該物件。在其他執行緒訪問物件時,呼叫執行緒將等待。脈衝訊號用於通知等待執行緒有關物件狀態的更改。

pulse (訊號), pulseall

向 乙個或多個等待執行緒傳送訊號。該訊號通知等待執行緒鎖定物件的狀態已更改,並且鎖的所有者準備釋放該鎖。等待執行緒被放置在物件的就緒佇列中以便它可以最後接 收物件鎖。一旦執行緒擁有了鎖,它就可以檢查物件的新狀態以檢視是否達到所需狀態。

exit

釋 放物件上的鎖。此操作還標記受鎖定物件保護的臨界區的結尾。

使用enterexit方法標記臨界區的開頭和結尾。如果臨界區是乙個連續指令集,則由enter方法獲取的鎖將保證只有乙個執行緒可以使用鎖定物件執行所包含的**。

個人對monitor類的理解:

1.實看msdn的描述似乎monitor類和mutex類的功能差不多,都是鎖定臨界區來到達多執行緒同步,其實,如果只用monitor類的enter和exit方法的話也會出現用mutex類鎖定臨界區的情況,即在出了臨界區,每個執行緒(包括剛釋放鎖的執行緒)都會去搶這個鎖。但是因為有了monitor類的wait方法和pluse方法才可以讓兩個執行緒到達互斥訪問臨界區的目的,即每個執行緒訪問互動的訪問自己的執行緒上下文(這樣說好些?說自己的**區是否也可以?),但是這兩個方法必須放在用lock或monitor(用enter和exit方法)鎖定的臨界區內!

Python中線程的使用

併發 多個任務同一時間段進行 並行 多個任務同一時刻進行 執行緒的實現 執行緒模組 python通過兩個標準庫 thread 和threading,提供對執行緒的支援 threading對 thread進行了封裝 因此在實際的使用中我們一般都是使用threading threading模組中提供了t...

集合中線程安全的類

集合中線程安全的類有 vector,stack,hashtable,enumeration,除此之外均是非執行緒安全的類與介面 collection是物件集合,collection有兩個子介面 list 和 set,list 可以通過下標 1,2.來取得值,值可以重複,而 set 只能通過游標來取值...

C 中線程的用法

通過委託的方式建立執行緒 static int sum int x return x x funca sum 建立乙個新的執行緒格式 a.begininvoke 10 獲取乙個執行緒的返回值 iasyncresult ar a.begininvoke 10,null,null 第二種方法 iasyn...