1. 程式人生 > >騎著蝸牛'深一'族

騎著蝸牛'深一'族

使隸屬於同一個程序下的各個執行緒協調一致的工作成為執行緒同步。MFC提供了多種同步物件,如CEvent、CCriticalSection、CSemephore、CMutex等。另外,MFC也提供了執行緒同步輔助類CSiingleLock和CMutiLock。通過這些類,可以比較容易的做到執行緒同步。
等待函式
Win32 API提供了一組能使執行緒阻塞其自身執行的等待函式。這些函式只有在作為其引數的一個或多個同步物件產生訊號時才會返回。在超過規定的等待時間後,不管有無訊號,函式也都會返回。在等待函式未返回時,執行緒處於等待狀態,此時執行緒只消耗很少的CPU時間。
使用等待函式即可以保證執行緒的同步,又可以提供程式的執行效率吧。其中最常用的等待函式有WaitForSingleObject和WaitForMultipleObject,他們分別用於檢測單個同步物件和多個檢測同步物件。
1.WaitForSingleObject
函式的原型:DWORD WaitForSingleObject(HANDLE hHandle,DWORD deWilliseconds);
引數hHandle是同步物件的控制代碼。引數dwMilliseconds是以毫秒為單位的超時間隔,如果該引數為0,那麼函式就測試同步物件的狀態並立即返回;如果該引數為INFINITE,則超時間隔是無限的。
2.WaitForMultipleObject
函式的原型:DWORD WaitForMultipleObject(DWORD nCount,CONST HANDLE *lpHandles,BOOL bWaitAll,DWORD deMilliseconds);
lpHandles代表一個控制代碼陣列,而引數nCount是控制代碼陣列中控制代碼的數目。引數bWaitAll說明了等待型別,如果為TURE,那麼函式在所有物件都有訊號才會返回;如果是FLASE,則只要有一個物件變成有訊號的函式就會返回。引數deMilliseconds是以毫秒為單位的超時間隔,如果該引數為0,那麼函式就測試同步物件的狀態並立即返回;如果該引數為INFINITE,則超時間隔是無限的。


CEvent類實現執行緒的同步
事件物件(CEvent)是最簡單的同步物件,它包括了有訊號和無訊號的兩種狀態。在縣城訪問某一資源之前,也許需要等待某一事件的發生,這時用事件物件是最合適的。例如,只有在通訊埠緩衝區收到資料後,監視執行緒才被啟用。
MFC中,CEvent類提供了對事件的支援。CEvent物件有兩種型別:人工事件和自動事件。對於自動事件,當其獲得訊號後,就會釋放下一個可用的執行緒。一個自動CEvent物件在被至少一個執行緒釋放後會自動返回到無訊號的狀態;而人工事件物件獲得訊號後,釋放所有可利用執行緒,直到呼叫成員函式ReSetEvent()將其設定為無訊號狀態為止(再創將CEvent類的物件時候,預設的建立是自動事件)。
一個CEvent物件線上城中被建立後,自動處於無訊號的狀態,但在另一個執行緒中可以呼叫WaitForSingleObject來監視其狀態。


CCriticalSection類實現執行緒同步
當多個執行緒訪問一個獨佔性共享資源時,可以使用Critical Section(臨界區)物件。任意時刻只有一個執行緒可以擁有臨界區物件,擁有臨界區物件的執行緒可以訪問被保護起來的資源或程式碼段,其他希望進入臨界區的執行緒被掛起等待,知道擁有臨界區物件的執行緒放棄臨界區物件為止。因此,任意時刻只有一個執行緒可以擁有臨界區物件,而只有擁有臨界區物件的執行緒才可以訪問受保護的資料。
使用CCriticalSection有兩種方法:
其一:1.單獨使用CCriticalSection類的一個全域性物件,以使各個執行緒均能訪問,例如:CCriticalSection critical_section(CCriticalSection類的建構函式是由一種形式,及不帶任何的引數)
2.在訪問需要保護的資源或程式碼之前,呼叫CCriticalSection類的成員函式Lock活的臨界區物件。如critical_section.Lock();如果此時沒有去他執行緒佔用臨界區物件,則呼叫Lock函式的現成活的臨界區;否則執行緒即將掛起,並放入到一個系統佇列中等待,直到當前擁有臨界區的執行緒釋放了臨界區時為止。
3.訪問臨界區完畢後,使用CCriticalSection的成員函式Unlock來釋放臨界區。程式碼如:critical_section.Unlick();
其二:1.與同步輔助類CSingleLock或者CMutiLock一起使用
2.定義CCriticalSection類的一個全域性物件,格式如:CCriticalSection critical_section;
3.在訪問需要保護的資源之前,定義CSingleLock類的一個變數,並將critical_Section的地址傳送給建構函式:CSingleLock singlelock(&critical_section);
4.使用CStingleLock類的成員函式Lock請求活的臨界區。如:singlelock.Lock();如果臨界區已經被其他執行緒佔用,則本執行緒掛起,等待臨界區被釋放。活的臨界區物件後返回。
5.本執行緒中訪問臨界區中的共享資源後,呼叫CSingleLock類的成員函式Unlock來釋放臨界區物件,如singlelock.Unlock();


互斥物件(Mutex)類似於臨界區物件,但與臨界區物件的不同點在於互斥物件可以在程序間使用,而臨界區物件只能在同一程序的各執行緒間使用。當然互斥物件也可以用於同一程序的各個執行緒間,但是在這種情況下使用臨界區物件會更節省系統資源,更有效率。

CSemaphore類實現執行緒同步

使用訊號量物件(Semaphore)也可以實現執行緒同步。訊號量物件維護一個從0開始的計數,在計數值大於0時物件是有訊號的,而在計數值為0是無訊號的。通過使用訊號量物件,可以限制對共享資源進行訪問的執行緒數量。

MFC中,CSemaphore類實現了對訊號量物件的封裝。具體來講CSemaphore的一個物件儲存了對當前訪問某一指定資源的執行緒的計數值,該計數值是當前還可以使用該資源的執行緒的數目。如果這個計數達到了零,則所有對這個CSemaphore類物件鎖孔哈I找的資源的訪問嘗試都被放入到一個佇列中等待,直到超時或計數值不為零時為止。

當一個執行緒訪問了被保護的資源是,計數值減1;一個縣城完成了對被控共享資源的訪問時,計數值增1;

在CSemaphore類物件的建構函式中可以指定控制的資源可以同時接受訪問的最大執行緒數,建構函式原型:CSemaphore(LONG lInitialCount = 1,LONG lMaxCount =1,LPCTSTR pstrName = NULL,LPSECURITY_ATTRIBUTES lpaxAttributes = NULL);

CSemaphore類一般也與執行緒同步輔助類CSingleLock或者CMutiLock類結合起來。其用法與CCriticalSection類似。

相關推薦

蝸牛''

使隸屬於同一個程序下的各個執行緒協調一致的工作成為執行緒同步。MFC提供了多種同步物件,如CEvent、CCriticalSection、CSemephore、CMutex等。另外,MFC也提供了執行緒同步輔助類CSiingleLock和CMutiLock。通過這些類,可以

P2345 奶牛集會andP2657 低頭

分別是 指標 one src 歸並 algorithm 交流 背景 algo 做法是一樣的 題目背景 MooFest, 2004 Open 題目描述 約翰的N 頭奶牛每年都會參加“哞哞大會”。哞哞大會是奶牛界的盛事。集會上的活動很 多,比如堆幹草,跨柵欄,摸牛仔

語音信息讓人“害怕”!社交焦慮癥要更步了?

語音信息對於絕大部分人來說,基於互聯網線上社交的重要性其實已經比線下真實社交更加重要。這一張虛擬的社交網絡,囊括了人們喜怒哀樂的情緒,也成為溝通、交流的重要渠道。當然,也由此帶來諸多負面問題。尤其是各種繁雜的社交信息、24小時不間斷的聯絡等,成為大眾生活中讓人心煩意亂的“幹擾源”。而就目前來看,語音信息首當其

治病誤診只害人 風水誤葬殃及

風水中國風水:治病誤診只害一人 風水誤葬殃及一族中國的風水學,可以說是一門玄之又玄的學問,它的應驗程度,震驚朝野,震驚國內外,在古代,國家即設置了相關的專業部門,在唐朝,我們的風水祖師楊筠松,即是專門掌管靈臺地理的,是唐朝國師、禦用風水大師,官至 金紫光祿大夫。 由於古代朝廷對風水的重視,使研習風水術者蔚然成

Spring Boot從簡入()

簡介 Spring Boot來簡化SPring應用開發,約定大於配置,去繁從簡,just run就能建立一個獨立的,產品級別應用 背景: J2EE笨重的開發、繁多的配置、低下的開發效率、發雜的部署流程、第三方技術整合難度發 解決: "Spring全家桶時代"     SPring

11月24日淘寶直播機構大會風暴的人

2018年11月24日,杭州,淘寶機構大會!今天現場參加了本次到大會並強勢做了全程的記錄。本次大會,淘寶直播負責人趙圓圓老師,淘寶內容生態總監間仲,等負責人及小二團隊,出事現場及進行分享。 我們將會通過PPT的形式,分享現場記錄。下面是關於整個會議的安排流程。下面是根據我們總結的幾個模組進行一一分享。一,淘

程式設計師的奮鬥史(十八)——人活,只是種態度

人活著,只是一種態度。          同一個世界,你的態度怎麼樣,它就是怎麼樣。同一件事情,你是怎麼認為的,它就是怎麼樣的。          只要心情好,一切都不會太壞。你對生活什麼態度,

辦公必學:用PDF巧妙儲存文件格式

平常我們用PPT或者Word做好方案,並將它發給客戶時,經常會遇到這樣的問題,萬一對方軟體版本低或者缺少字型,你無法想象對方看到的是啥醜樣。 這裡,我們只需要將檔案另存為PDF格式,那麼無論在哪一臺電腦上開啟,無論電腦上安裝的是Office2003、2007、2010還是WPS,文件還是原本的樣子,不會出現

辦公必學:用PDF巧妙保存文檔格式

文檔 無法 亂碼 rod 下載 png 臺電腦 簡單 str 平常我們用PPT或者Word做好方案,並將它發給客戶時,經常會遇到這樣的問題,萬一對方軟件版本低或者缺少字體,你無法想象對方看到的是啥醜樣。 這裏,我們只需要將文件另存為PDF格式,那麽無論在哪一臺電腦上打開,無

演練VC中的COMMON(轉貼)之二

第6章 演練CToolBar6.1 工具條控制的主要功能    所謂工具條就是具有點陣圖和分隔符組成的一組命令按鈕,點陣圖按鈕部分可以是下推按鈕、檢查盒按鈕、無線按鈕等。工具條物件類派生於主視窗架框類CframeWnd或CMDIFrameWnd,其類控制CToolBar::GetToolBarCtrl是M

提醒:電腦常感眼睛乾澀可能是乾眼症

來源:中國食品科技網    經常在電腦前的人,往往會感覺眼睛勞累、乾澀,值得注意的是如果眼睛經常容易乾澀很可能是乾眼症!乾眼症是指由於淚液的量或質的異常引起淚膜不穩定和眼表損害而致眼部不適的一類疾病,和飛蚊症一樣,電腦一族一定要防微杜漸,盡全力預防此類疾病孳生。    眼睛有

05 - 查詢重複行3 步瞭解go

前2節已經對 dup 做了深一步的解析, dup1 和 dup2都是以資料流的形式輸入。理論上可以處理任意多行的輸入資料,它是一步一步以資料流的方式讀取資料。另外還可以一口氣將資料全部讀取到記憶體中,一次分割成多行,然後在處理 一、 dup3 執行路徑: $GOPA

04 - 查詢重複行2 步瞭解go

接上一節任務執行後續 在上一節中 dup1 從標準輸入當中獲取資料,而在 dup2 當中我們讀取標準輸入或是使用os.Open開啟各個具名檔案,並操作它們。 一、dup2 執行路徑: $GOPATH/src/gopl/ch1/dup 執行方式 $ go

03 - 查詢重複行1 步瞭解go

思路 對檔案做拷貝、列印、搜尋、排序、統計或類似事情的程式都有一個差不多的程式結構:一個處理輸入的迴圈,在每個元素上執行計算處理,在處理的同時或最後產生輸出。 接下來根據 Linux 的 uniq 命令,其尋找響鈴的重複行,我們將會用 go 語言編寫三個版本的 dup, 方

ps5實現閉眼睛-->睜開眼睛(分別需要張閉眼睛和張睜眼睛的照片)

注:此方法適用於已經分別存在閉眼和睜眼的照片,初次嘗試,就是簡單的處理,只是為了記錄下而已,如有補充還請指點,O(∩_∩)O謝謝~ 1.首先開啟需要處理的閉眼的照片(快捷鍵:Ctrl + O); 2.選擇快速蒙版模式,如圖: 3.選擇  檔案-->置入,雙擊

對記憶體對齊的步理解

接觸記憶體對齊這個概念,也有三四年了。不過由於我工作後一直做遊戲伺服器,都是在x86架構的機子上寫程式碼,也沒怎麼注意記憶體對齊。使用最多的估計也就是面試時經常問結構體大小。最近在寫自己伺服器框架的二進流讀寫模組時,整理了下這方面的內容。本方不會涉及基本概念。   記憶

小區地下室住了群不明身份的人,討厭的蟑螂

    小區物業管理混亂,地下室的一隻蟑螂居然帶這保安上來找我,說我吵著它了,走的時候還留下威脅的話,嗎個比的,我立刻報了警,警察很快趕到。蟑螂和保安都跟老鼠似的跑掉了,物業給它們打電話它們也不敢過來跟警察對峙,今天碰見了保安,我告訴它它們已經上了派出所的黑名單了,我就不信

安卓鍵修改IMEI號碼、修改串號工具,擼客的必備

       很多擼客,有擼美團擼大眾的,還有各種擼客,以前很火,這些我都叫做擼客,也屬於網賺一族吧,之前在群裡很多新手都不懂如何擼,不知道如何修改手機IMEI串號,我給他們分享了能夠模擬手機串號的工具琢石模擬器,這也是擼客老手必備的工具,當然琢石模擬器自身的功能是保護手機

沐浴晨風想想,今天該怎樣努力;踏夕陽問問,今天學到了什麼。

直接把檔案放入資料庫中比較適合小檔案,方便管理,比如頭像圖片和聲音,如果是較大型的檔案建議不要直接存進資料庫,而是放在伺服器,把檔案索引放在資料庫。 MYSQL 中有個資料物件是 BLOB,即 Binary Large Object,顧名思義也就是二進位制大型資料物件,用來

5.21 - 入Python似海,從此節操是路人

passwd isdigit 操作 用戶名 continue str 字符串 () open 5.21,Python第二節,伊始,我感覺我來到了蜀道的山腳下,擡頭仰望,盡是巍峨,心底又不要臉的有一點兒小期待[*臉紅*] 這節課,我回憶起來都是些零零碎碎,講了字符串、列表、字