一、
概念1、程序:通常被定義為乙個正在執行的程式的例項,是乙個程式在其自身的位址空間中的一次執行活動。乙個程式可以有多個程序例項。
2、程序由兩個部分組成:
1)作業系統用來管理程序的核心物件。核心物件也是系統用來存放關於程序的統計資訊的地方。
2)位址空間。它包含所有可執行模組或
dll模組的**和資料。它還包含動態記憶體分配的空間。如執行緒堆疊和堆分配空間。
程序從來不執行任何東西,它只是執行緒的容器。若要使程序完成某項操作,它必須擁有乙個在它的環境中執行的執行緒,此執行緒負責執行包含在程序的位址空間中的**。
單個程序可能包含若干個執行緒,這些執行緒都「同時」執行程序位址空間中的**。
每個程序至少擁有乙個執行緒,來執行程序的位址空間中的**。當建立乙個程序時,作業系統會自動建立這個程序的第乙個執行緒,稱為主線程。此後,該執行緒可以建立其他的執行緒。
乙個程序不能讀取、寫入、或者以任何方式訪問駐留在該分割槽中的另乙個程序的資料。
3、執行緒由兩個部分組成:
1)執行緒的核心物件,作業系統用它來對執行緒實施管理。核心物件也是系統用來存放執行緒統計資訊的地方。
2)執行緒堆疊,它用於維護執行緒在執行**時需要的所有引數和區域性變數。
執行緒總是在某個程序環境中建立。系統從程序的位址空間中分配記憶體,供執行緒的堆疊使用。新執行緒執行的程序環境與建立執行緒的環境相同。因此,新執行緒可以訪問程序的核心物件的所有控制代碼、程序中的所有記憶體和在這個相同的程序中的所有其他執行緒的堆疊。這使得單個程序中的多個執行緒確實能夠非常容易地互相通訊。
執行緒只有乙個核心物件和乙個堆疊,保留的記錄很少,因此所需要的記憶體也很少。因為執行緒需要的開銷比程序少,因此在程式設計中經常採用多執行緒來解決程式設計問題,而盡量避免建立新的程序。
作業系統為每乙個執行執行緒安排一定的cpu
時間 —— 時間片。
二、執行緒程式設計
用createthread
來建立執行緒。
main函式是主線程的入口函式。新建立的執行緒也需要乙個入口函式,就在下面的
lpstartaddress
中定義。
handle createthread(
lpsecurity_attributes lpthreadattributes, // sd
dword dwstacksize, // initial stack size
lpthread_start_routine lpstartaddress, // thread function
lpvoid lpparameter, // thread argument
dword dwcreationflags, // creation option
lpdword lpthreadid // thread identifier
);lpthreadid 用來接收執行緒的id。
dword winapi threadproc( lpvoid lpparameter );
型別和引數要匹配,函式名任意。
關閉執行緒控制代碼
bool closehandle( handle hobject );
注意:關閉控制代碼並沒有終止新建立的執行緒。只是表示對新建立的執行緒的引用不敢興趣,系統會遞減新
執行緒的執行緒核心物件的使用計數。當使用計數為0
的時候,系統就會釋放執行緒核心物件。如果在主線程中沒有關閉執行緒的控制代碼,始終都會保留乙個引用。這樣執行緒核心物件的引用計數就不會為
0。即使新執行緒執行完畢,執行緒核心物件也不會被釋放,只有等到程序終止的時候系統才會為殘留的物件做清理工作。所以應該在不再使用執行緒的控制代碼的時候將其關閉掉,讓執行緒的執行緒核心物件的引用計數減1。
每個執行緒有乙個引用記數器,當建立成功時初值為2
,當你呼叫一次
closehandle()
時,計數器減一,如果為
0,清除執行緒。執行緒執行完成計數器還是要減一,如果為
0,清除執行緒。
暫停執行緒的執行
當執行緒暫停執行的時候,也就是表示它放棄了執行的權力。作業系統會從等待執行的執行緒佇列中選擇乙個執行緒來執行。新建立的執行緒就可以得到執行的機會。
可以使用函式sleep:
void sleep( dword dwmilliseconds //sleep time 以毫秒為單位
);暫停當前執行緒指定時間間隔的執行。
參考[1] 孫鑫 《深入
vc++》
非同步多執行緒 3 多執行緒安全
多執行緒去訪問同乙個集合,一般沒問題,執行緒安全問題一般是出在同時修改乙個物件的時候。執行緒安全問題 一段 單執行緒執行和多執行緒執行,結果不一致。例如這個方法,很簡單,迴圈開啟task往乙個list裡add,等3秒鐘執行完後列印出來list的長度,如果是單執行緒,肯定是10000,現在看看多執行緒...
多執行緒 17 多執行緒題1
1 原始 現有的程式 模擬產生了16個日誌物件,並且需要執行16秒才能列印完這些日誌,請在程式中增加4個執行緒去呼叫parselog 方法來分頭列印這16個日誌物件,程式只需要執行4秒即可列印完這些日誌物件。原始 如下 public class test parselog方法內部的 不能改動 pub...
多執行緒(3) 執行緒通訊
執行緒之間的通訊 多個執行緒在處理同乙個資源,但是處理的動作 執行緒的任務 卻不相同。通過一定的手段使各個執行緒能有效的利用資源。而這種手段即 等待喚醒機制。等待喚醒機制所涉及到的方法 wait 等待,將正在執行的執行緒釋放其執行資格 和 執行權,並儲存到執行緒池中。notify 喚醒,喚醒執行緒池...