程序和執行緒都是作業系統的概念 ; 程序是應用程式的執行例項 , 每個程序是由私有的虛擬位址空間 , ** , 資料和其它各種系統資源組成 , 程序在執行過程中建立的資源隨著程序的終止而被銷毀 , 所使用的系統資源在程序終止時被釋放或關閉 ;
執行緒是程序內部的乙個執行單元 ; 系統建立好程序後 , 實際上就啟動執行了該程序的主執行執行緒 , 主執行執行緒以函式位址形式 , 比如說 main 或 winmain 函式 , 將程式的啟動點提供給 windows 系統 ; 主執行執行緒終止了 , 程序也就隨之終止 ;
每乙個程序至少有乙個主執行執行緒 , 它無需由使用者去主動建立 , 是由系統自動建立的 ; 使用者根據需要在應用程式中建立其它執行緒 , 多個執行緒併發地執行於同乙個程序中 ; 乙個程序中的所有執行緒都在該程序的虛擬位址空間中 , 共同使用這些虛擬位址空間 , 全域性變數和系統資源 , 所以執行緒間的通訊非常方便 , 多執行緒技術的應用也較為廣泛 ;
win32 sdk 函式支援進行多執行緒的程式設計 , 並提供了作業系統原理中的各種同步 , 互斥和臨界區等操作 ; visual c++ 6.0 包括及以後版本中 , 使用mfc 類庫也實現了多執行緒的程式設計 , 使得多執行緒程式設計更加方便 ;
win32 提供了一系列的 api 函式來完成執行緒的建立 , 掛起 , 恢復 , 終結以及通訊等工作 ; 下面將選取其中的一些重要函式進行說明 ;
handle createthread(lpsecurity_attributes lpthreadattributes,
dword dwstacksize,
lpthread_start_routine lpstartaddress,
lpvoid lpparameter,
dword dwcreationflags,
lpdword lpthreadid);
該函式在其呼叫程序的程序空間裡建立乙個新的執行緒 , 並返回已建執行緒的控制代碼 , 其中各引數說明如下 :
lpthreadattributes : 指向乙個security_attributes
結構的指標 , 該結構決定了執行緒的安全屬性 , 一般置為 null ;
dwstacksize : 指定了執行緒的堆疊深度 , 一般都設定為 0 ;
lpstartaddress : 表示新執行緒開始執行時**所在函式的位址 , 即執行緒的起始位址 , 一般情況為(lpthread_start_routine)threadfunc
, threadfunc 是執行緒函式名 ;
lpparameter : 指定了執行緒執行時傳送給執行緒的 32 位引數 , 即執行緒函式的引數 ;
dwcreationflags : 控制線程建立的附加標誌 , 可以取兩種值 ; 如果該引數為 0 , 執行緒在被建立後就會立即開始執行;如果該引數為 create_suspended , 則系統產生執行緒後 , 該執行緒處於掛起狀態 , 並不馬上執行 , 直至函式 resumethread 被呼叫 ;
lpthreadid : 該引數返回所建立執行緒的 id ;
如果建立成功則返回執行緒的控制代碼 , 否則返回 null ;
dword suspendthread(handle hthread);
該函式用於掛起指定的執行緒 , 如果函式執行成功 , 則執行緒的執行被終止 ;
dword resumethread(handle hthread);
該函式用於結束執行緒的掛起狀態 , 執行執行緒 ;
void exitthread(dword dwexitcode);
bool terminatethread(handle hthread,dword dwexitcode);
一般情況下 , 執行緒執行結束之後 , 執行緒函式正常返回 , 但是應用程式可以呼叫 terminatethread 強行終止 (異常終止乙個執行緒) 某一線程的執行 ; 各引數含義如下 :
hthread : 將被終結的執行緒的控制代碼 ;
dwexitcode : 用於指定執行緒的退出碼 ;
使用terminatethread()
終止某個執行緒的執行是不安全的 , 可能會引起系統不穩定 ; 雖然該函式立即終止執行緒的執行 , 但並不釋放執行緒所占用的資源 , 一般不建議使用該函式 ;
bool postthreadmessage(dword idthread,
uint msg,
wparam wparam,
lparam lparam);
該函式將一條訊息放入到指定執行緒的訊息佇列中 , 並立即返回 (不等到訊息被該執行緒處理完) ; 各引數含義如下 :
idthread : 將接收訊息的執行緒的id ;
msg : 指定用來傳送的訊息 ;
wparam : 同訊息有關的字引數 ;
lparam : 同訊息有關的長引數 ;
呼叫該函式時 , 如果即將接收訊息的執行緒沒有建立訊息迴圈 , 則該函式執行失敗 ;
bool getexitcodethread( handle htread, lpdword lpexitcode)
獲取執行緒的退出碼 , htread 可在 cwinthread 的成員變數 m_htread 獲得 ;
如果執行緒還沒有終止 , 則獲得still_active(0x103)
;
getthreadpriority setthreadpriority gettpriorityclass setpriorityclass // 後兩個針對 cwinthread
執行緒優先順序操作函式
win32 建立多執行緒**如下 :
#include "stdafx.h"
#include #include "windows.h"
using namespace std;
dword winapi threaddemofunc(lpvoid lpparameter); // 宣告 win32 執行緒函式
int main()
{ cout<<"[m] main thread is running"《作者 github : tojohnonly , 部落格 : enskdecode
win32多執行緒程式設計
使用3個執行緒完成6個任務,工作的執行是靠呼叫sleep 來模擬,時間長度是隨機給予的,只要乙個執行緒結束,就會有另乙個執行緒被產生。taskques.cpp 定義控制台應用程式的入口點。include stdafx.h include include include define win32 le...
Win32多執行緒程式設計 一
1.程序 從win32的角度來看,程序就是一大堆物件的擁有權的集合,程序擁有的物件包括記憶體和資源兩類 程序擁有的記憶體 被程序擁有的記憶體可以分為以下三個型別 1 code code是程式的可執行部分,一定是唯讀性質 2 data data是程式中的所有變數 不包括函式中的區域性變數 可以分為全域...
Win32多執行緒程式設計 序
程式是乏味的代言人,程式世界是如此的單調,上帝說,讓世界變的精彩,從此有了多執行緒程式設計 從第一台計算機出現開始,順序程式設計就開始深入人心,將任務劃分為乙個流程,交給計算機去做,一切都那麼理所當然,程式世界就像乙個黑白的世界,井然有序卻又單調乏味,多執行緒多工程式設計理念的提出,讓程式世界開始變...