孫鑫VC 第15章多執行緒

2021-06-09 07:42:42 字數 2596 閱讀 5553

第15章

1.      程序從來不執行任何東西,它只是執行緒的容器。若要使程序完成某項操作,它必須擁有乙個在它環境中執行的執行緒,此執行緒負責執行包含在程序的位址空間中的**。

即,真正完成**執行的是執行緒,而程序只是執行緒的容器,或者說是執行緒的執行環境;

2.      頁檔案透明的為應用程式增加了可以使用的記憶體。它通過在磁碟上劃分出一塊空間當做記憶體使用,從而增加了應用程式可以使用的記憶體,我們把這個稱為虛擬記憶體;

3.      新執行緒執行的環境與建立執行緒的環境相同,因此,新執行緒可以訪問程序的核心物件的所有控制代碼、程序中的所有記憶體和在這個相同的程序中所有其他執行緒的堆疊,這使得單個程序中的多個執行緒確實能夠非常容易地互相通訊;

執行緒只有乙個核心物件和乙個棧,保留的記錄很少,因此所需要的記憶體也很少,建立執行緒需要的開銷比程序少。

4.      作業系統為每乙個執行執行緒安排一定的cpu時間----時間片。系統通過一種迴圈的方式為執行緒提供時間片,執行緒在自己的時間內執行;

5.      盡量採用多執行緒的兩個原因:

1.      對程序的建立來說,系統要為程序分配私有的4gb的虛擬位址空間,當然它所佔的資源就比較多,而對於多執行緒來說,多個執行緒是共享同乙個程序的位址空間,所以占用的資源就比較少。

2.      另乙個原因是當程序切換時,需要交換整個位址空間,而執行緒之間的切換只是執行環境的改變,因此效率高;

6.      多執行緒的建立createthread

#include

#include

using namespace std;

dword winapi fun1proc(lpvoid lpparameter);

void main()

handlehthread1;

hthread1=createthread(null,0,fun1proc,null,0,null);

closehandle(hthread1);

cout<< "main thread is running" << endl;

sleep(20);

//執行緒1的入口函式

dword winapi fun1proc(lpvoid lpparameter)

cout<< "thread1 is running " << endl;

cin.get();

return0;

注意引數:頁面是系統管理記憶體時使用的記憶體單位,不同的cpu其頁面大小不同,x86使用的頁面大小事4kb。

倒數第二個引數有兩種取值:

1.      create_suspended,那麼執行緒建立後處於暫停狀態,知道程式呼叫了resumethread函式為止;

2.      0,那麼執行緒在建立之後就立即執行了;

為了讓新建立的執行緒能夠得到執行的機會,就需要使主線程暫停使用,即放棄執行的權利,作業系統就會從等待執行的執行緒佇列中選擇乙個執行緒來執行,這時新建立的執行緒就可以得到執行的機會;sleep函式解決

7.      利用互斥物件實現執行緒同步

互斥物件屬於核心物件,它能夠確保執行緒擁有對單個資源的互斥訪問權,互斥物件包含乙個使用數量,乙個執行緒id和乙個計數器。其中id用於標識系統中的哪個執行緒當前擁有互斥物件。

建立互斥物件:createmutex(三個引數)

1.      第乙個為null,讓互斥物件使用預設的安全性;

2.      bool型別,指定互斥物件初始的擁有者。如果該值為真,則建立這個互斥物件的執行緒獲得該物件的所有權;

3.      指定互斥物件的名稱,如果為null,則建立乙個匿名的互斥物件;

執行緒必須主動請求共享物件的使用權才能可能獲得該所有權,

呼叫waitforsingleobject函式來實現;(要注意這一對函式的位置)

釋放該物件的所有權:releasemutex函式;

對於互斥物件來說,它是唯一與執行緒相關的核心物件;

誰擁有,就誰釋放;

8.      可以通過命名的互斥物件來實現;

在呼叫createmutex函式建立乙個命名的的互斥物件後,接著呼叫getlasterror函式,如果這個函式返回error_already_exists,就表明先前已經建立了這個命名的互斥物件;也就是表明先前已經有該應用程式的乙個例項在執行了;

9.      在mfc中,載入套接字型檔,並進行版本協商;

afxsocketinit函式,這個函式不需要為工程鏈結ws2_32.lib庫檔案;

它需要包含相應的標頭檔案:afxsock.h

新增到stdafx.h標頭檔案中;它是乙個預編譯標頭檔案,在該檔案中包含了mfc應用程式執行所需的一些必要標頭檔案;

10.  對於網路聊天室程式來說,通常都是採用udp協議來實現的;

11.  呼叫類的成員函式,必須得先產生乙個該類的物件,然後才能呼叫該物件的成員函式;

解決方法:static成員函式;

12.如果單位要求採用完全物件導向的思想來程式設計,也就是說不能使用全域性函式和全域性變數,我們就可以採用靜態成員函式和靜態成員變數的方法來解決問題;

12.  在mfc中,如果需要對控制項進行操作,都是利用控制項所對應的類來完成的,ip控制項對應的mfc類是:cipaddressctrl.這個類裡面有乙個getaddress成員函式;

13.為了讓編輯框控制項接受換行符,必須設定該控制項支援多行資料這一屬性;

第15章 多執行緒

模擬銀行取錢的問題 1.定義乙個account類 1 該account類封裝了賬戶編號 string 和餘額 double 兩個屬性 2 設定相應屬性的getter和setter方法 3 提供無參和有兩個引數的構造器 4 系統根據賬號判斷與使用者是否匹配,需提供hashcode 和equals 方法...

孫鑫VC 第13章文件和序列化

第13章 文件與序列化 1.使用carchive類對檔案進行讀寫操作 carchive類物件將物件資料儲存到永久裝置上,例如磁碟檔案,讓物件資料永續性的過程就稱之為序列化 活序列化 在建立carchive物件之前必須先建立乙個cfile類或者其派生類物件,並且因此存檔物件既可以用來載入資料,也可以用...

孫鑫VC 第17章程序間的通訊

第17章 程序間的通訊 1.當乙個程序啟動後,作業系統為其分配4gb的私有位址空間。位於同乙個程序中的多個執行緒共享同乙個位址空間,因此執行緒之間的通訊非常簡單 2.四種程序間通訊方式 剪下板,匿名管道,命名管道,郵槽 3.如果某個程式已經開啟了剪貼簿,則其他應用程式將不能修改剪下板,直到前者呼叫了...