Win32 多執行緒程式設計

2021-08-07 21:19:57 字數 3106 閱讀 1339

程序和執行緒都是作業系統的概念 ; 程序是應用程式的執行例項 , 每個程序是由私有的虛擬位址空間 , ** , 資料和其它各種系統資源組成 , 程序在執行過程中建立的資源隨著程序的終止而被銷毀 , 所使用的系統資源在程序終止時被釋放或關閉 ;

執行緒是程序內部的乙個執行單元 ; 系統建立好程序後 , 實際上就啟動執行了該程序的主執行執行緒 , 主執行執行緒以函式位址形式 , 比如說 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多執行緒程式設計 序

程式是乏味的代言人,程式世界是如此的單調,上帝說,讓世界變的精彩,從此有了多執行緒程式設計 從第一台計算機出現開始,順序程式設計就開始深入人心,將任務劃分為乙個流程,交給計算機去做,一切都那麼理所當然,程式世界就像乙個黑白的世界,井然有序卻又單調乏味,多執行緒多工程式設計理念的提出,讓程式世界開始變...