C 多執行緒技術 API

2021-06-05 04:04:34 字數 4822 閱讀 9265

更多詳見msdn--process and thread functions

createthread將在主線程的基礎上建立乙個新執行緒,大致做如下步驟:

1)在核心物件中分配乙個執行緒標識/控制代碼,可供管理,由createthread返回

2)把執行緒退出碼置為still_active,把執行緒掛起計數置1

3)分配context結構

4)分配兩頁的物理儲存以準備棧,保護頁設定為page_readwrite,第2頁設為page_guard

5)lpstartaddr和lpvthread值被放在棧頂,使它們成為傳送給startofthread的引數

6)把context結構的棧指標指向棧頂(第5步)指令指標指向startofthread函式

handle winapi createthread(

__in_opt lpsecurity_attributes lpthreadattributes,

__in size_t dwstacksize,

__in lpthread_start_routine lpstartaddress,

__in_opt lpvoid lpparameter,

__in dword dwcreationflags,

__out_opt lpdword lpthreadid

);

1)lpthreadattributes:指向security_attributes型態的結構的指標。在windows 98中忽略該引數。在windows nt中,它被設為null,表示使用預設值。

2)dwstacksize,執行緒堆疊大小,一般=0,在任何情況下,windows根據需要動態延長堆疊的大小。   

3)lpstartaddress,指向執行緒函式的指標,形式:@函式名,函式名稱沒有限制,但是必須以下列形式宣告:   dword winapi threadproc (lpvoid lpparam) ,格式不正確將無法呼叫成功。   

4)lpparameter:向執行緒函式傳遞的引數,是乙個指向結構的指標,不需傳遞引數時,為null。   

5)dwcreationflags :執行緒標誌,可取值如下 :

(a)create_suspended-----建立乙個掛起的執行緒,

(b)0---------------------------------表示建立後立即啟用。   

6)lpthreadid:儲存新執行緒的id。   

7)返回值:函式成功,返回執行緒控制代碼;函式失敗返回false。 

一般並不推薦使用 createthread函式,而推薦使用rtl 庫里的system單元中定義的 beginthread函式,因為這除了能建立乙個執行緒和乙個入口函式以外,還增加了幾項保護措施。 

在mfc程式中,應該呼叫afxbeginthread函式,在visual c++程式中應呼叫_beginthreadex函式。

建立乙個在其它程序位址空間中執行的執行緒(也稱:建立遠端執行緒)。

handle winapi createremotethread( 

__in handle hprocess,

__in lpsecurity_attributes lpthreadattributes,

__in size_t dwstacksize,

__in lpthread_start_routine lpstartaddress,

__in lpvoid lpparameter,

__in dword dwcreationflags,

__out lpdword lpthreadid

);

handle createremotethreadex(

__in handle hprocess,

__in_opt lpsecurity_attributes lpthreadattributes,

__in size_t dwstacksize,

__in lpthread_start_routine lpstartaddress,

__in_opt lpvoid lpparameter,

__in dword dwcreationflags,

__in_opt lpproc_thread_attribute_list lpattributelist,

__out_opt lpdword lpthreadid

);

1)hprocess:執行緒所屬程序的程序控制代碼. 該程序必須具有 process_create_thread, process_query_information, process_vm_operation, process_vm_write,和process_vm_read 訪問許可權.

2)lpthreadattributes:乙個指向 security_attributes 結構的指標, 該結指定了執行緒的安全屬性。可為null,表示執行緒擁有預設的安全屬性且執行緒控制代碼不可被繼承。

3)dwstacksize:執行緒初始大小,以位元組為單位,如果該值設為0,那麼使用系統預設大小。

4)lpstartaddress:在遠端程序的位址空間中,該執行緒的執行緒函式的起始位址

5)lpparameter:傳給執行緒函式的引數

6)dwcreationflags:執行緒的建立標誌,表示建立後立即執行執行緒(0),還是將執行緒掛起(create_suspended)

7)lpthreadid:輸出執行緒id

8)lpattributelist:新執行緒的附加屬性,通過initializeprocthreadattributelist建立

9)返回值:如果執行成功,返回新執行緒控制代碼以及輸出執行緒id,否則返回null

用於非正常終止執行緒

1.3.1 exitthread

該函式將終止執行緒的執行,並導致作業系統消除該執行緒使用的所有作業系統資源,但是c++資源(如c++類物件堆記憶體)將不被撤銷。可以使用exitthread的dwexitcode引數告知系統將該執行緒的退出碼設定為該值。

1.3.2 terminatethread

bool terminatethread( handle hthread, dword dwexitcode);
掛起執行緒和執行掛起執行緒

獲取執行緒退出碼

所有 win32 程式都至少有乙個執行緒。任何執行緒都可以建立附加執行緒。執行緒可以快速完成其工作,然後終止;也可以在程式的生存期內保持活動狀態。

libcmt 和 msvcrt c 執行庫提供以下用於建立和終止執行緒的函式:_beginthread, _beginthreadex 和 _endthread, _endthreadex。

_beginthread 和 _beginthreadex 函式建立新執行緒;如果操作成功,則返回執行緒識別符號。執行緒完成執行時自動終止,或者可通過呼叫 _endthread 或 _endthreadex 自行終止。

注意:如果要從使用 libcmt.lib 生成的程式呼叫 c 執行時例程,則必須使用 _beginthread 或 _beginthreadex 函式啟動執行緒。不要使用 win32 函式 exitthread 和 createthread。如果有乙個以上的執行緒在等待掛起的執行緒完成它對 c 執行時的資料結構的訪問時被阻塞,使用 suspendthread 會導致死鎖。

_endthread 函式終止由 _beginthread 建立的執行緒(同樣,_endthreadex 終止由 _beginthreadex 建立的執行緒)。執行緒會在完成時自動終止。_endthread 和 _endthreadex 用於從執行緒內部進行條件終止。例如,專門用於通訊處理的執行緒若無法獲取對通訊埠的控制,則會退出。

afxbeginthread 有兩個過載版本:乙個用於使用者介面執行緒,乙個用於輔助線程。若要開始執行輔助線程,請呼叫 afxbeginthread,並提供下列資訊:

1)控制函式的位址。

2)要傳遞到控制函式的引數。

3)(可選)所需的執行緒優先順序。預設值為正常優先順序。有關可用的優先順序級別的更多資訊,請參見 platform sdk 中的 setthreadpriority。

4)(可選)所需的執行緒堆疊大小。預設值與建立執行緒的堆疊大小相同。

5)(可選)create_suspended,如果希望在掛起狀態中建立執行緒。預設值為 0,即正常啟動執行緒。

6)(可選)所需的安全屬性。預設值與父執行緒具有相同的訪問權。有關此安全資訊格式的更多資訊,請參見 platform sdk 中的 security_attributes。

afxbeginthread 為您建立和初始化 cwinthread 物件、啟動該物件並返回其位址,以便以後引用。在整個過程中進行檢查,確保假如建立過程的任何部分出現故障,所有物件都能被正確地解除分配。

3.2.1 正常執行緒終止

對於輔助線程,正常執行緒終止很簡單:退出控制函式並返回表示終止原因的值。可以使用 afxendthread 函式或 return 語句。一般情況下,0 表示成功完成,但這取決於您自己。

對於使用者介面執行緒,該過程也很簡單:從使用者介面執行緒內呼叫 platform sdk 中的 postquitmessage。postquitmessage 採用的唯一引數是執行緒的退出**。對於輔助線程,0 通常表示成功完成。

3.2.2 過早的執行緒終止

過早終止執行緒幾乎一樣簡單:從執行緒內呼叫 afxendthread。將所需的退出**作為唯一引數傳遞。這將停止執行執行緒、解除對執行緒堆疊的分配、分離附加到執行緒的所有 dll 並從記憶體中刪除執行緒物件。

必須從要終止的執行緒內呼叫 afxendthread。如果要從其他執行緒終止執行緒,必須設定兩個執行緒間的通訊方法。

3.2.3 檢索執行緒的退出**

linux 多執行緒API

執行於乙個程序中的多個執行緒,它們之間使用相同的位址空間,而且執行緒間彼此切換所需的時間遠遠小於程序間切換所需要的時間。據統計,乙個程序的開銷大約是乙個執行緒開銷的30倍左右。同一程序下的執行緒直接共享資料空間。int pthread create pthread t thread,const pt...

多執行緒技術

1,程序 執行緒 程序 系統中同時執行的不同程式 執行緒 程式中同時執行不同的操作 單個cpu只能按順序執行指令,cpu可以隨機在不同的程序和執行緒進行切換,保證程序和執行緒都執行一遍後再重複這個過程。因為cpu執行速度足夠快,讓人感覺程式是同時執行的。2,執行緒 thread thread sle...

C 多執行緒技術總結(非同步)

我這裡針對現有的c 多執行緒技術進行乙個彙總,一是複習,二是方便索引,文章部份知識點 於網路,非本人原創。一 並行 非同步 1.system.threading.tasks命名空間下的 tpl 1.1 parallel.invoke 並行執行多個任務,主線程等待並行執行完畢後才開始續續執行。示例 s...