1. 程式人生 > >c++builder 多執行緒-建立 退出 及獲取執行緒返回碼

c++builder 多執行緒-建立 退出 及獲取執行緒返回碼

1. WIN32 API執行緒的建立

在程式中呼叫CreateThread函式可以建立一個執行緒:
  1. HANDLE CreateThread(  
  2.  LPSECURITY_ATTRIBUTES lpThreadAttributes,  
  3.  DWORD dwStackSize,  
  4.  LPTHREAD_START_ROUTINE lpStartAddress,  
  5.  LPVOID lpParameter,  
  6. DWORD dwCreationFlags,  
  7. LPDWORD lpThreadId);  

每個引數的含義為:

LPSECURITY_ATTRIBUTES lpThreadAttributes   一般設為NULL。

     該引數是指向一個SECURITY_ATTRIBUTES結構的指標。如果要賦予該執行緒核心物件預設的安全屬性,可以傳遞一個NULL。如果希望所有的子程序能夠繼承該執行緒物件的控制代碼,須設定一個SECURITY_ATTRIBUTES結構,它的bInheritHandle成員應初始化為TRUE。

DWORD dwStackSize  一般設為0

     該引數指定執行緒棧的大小。每個執行緒都擁有它自己的堆疊。如果dwStakSize為0,系統預設保留的棧的空間為1MB。

LPTHREAD_START_ROUTINE lpStartAddress  入口函式

    該引數用於指定新建執行緒的入口函式的地址。可以建立多個執行緒,使用相同的入口函式地址。該入口函式的原型為:

   DWORD WINAPI ThreadFunc(LPVOID lpParameter);

   名字可以改變,返回型別和引數相同就可以。

DWORD dwCreationFlags   一般為0

該引數控制建立執行緒的標誌,它可以是0或者CREATE_SUSPENDED。如果是0,則新建立的執行緒在建立完畢後被系統排程程式排程(可能被執行,也可能不被執行,這取決於系統中其他執行緒的優先順序情況)。如果該值為CREATE_SUSPENDED,系統在建立完新執行緒後,新執行緒被系統掛起,直到有其他執行緒執行了帶該新執行緒控制代碼的ResumeThread()函式後,新執行緒才被啟用。

LPDWORD lpThreadId  一般為NULL

該引數指定新執行緒的ID。在Windows95中,該引數不能為NULL,否則會引起錯誤,在Windows 2000中該引數可以為NULL。

例1:
建立執行緒,並傳遞引數:
  1. DWORD WINAPI SubThread(LPVOID lpParam)  
  2. {  
  3.     TRACE("SubThread,lpParam is:%d\n",lpParam);  
  4.     return 0;  
  5. }  
  6. void MainThread()  
  7. {  
  8.     HANDLE hThread=CreateThread(NULL,0,SubThread,(LPVOID)123,0,NULL);  
  9.     Sleep(1000);  
  10.     CloseHandle(hThread);  
  11. }  
例2:
建立掛起的新執行緒,老執行緒執行一些工作後,再啟用新建立的執行緒。
  1. DWORD WINAPI SubThread(LPVOID lpParam)  
  2. {  
  3.     TRACE("SubThread,lpParam is:%d\n",lpParam);  
  4.     return 0;  
  5. }  
  6.    
  7. void MainThread()  
  8. {  
  9.     HANDLE hThread=CreateThread(NULL,0,SubThread,(LPVOID)123,CREATE_SUSPENDED,NULL);  
  10.     TRACE("SubThread is created\n");  
  11.     ResumeThread(hThread);  
  12.     Sleep(1000);  
  13.     CloseHandle(hThread);  
  14. }  
2. 執行緒的終止
可以使用下面方法來終止執行緒:
執行緒函式的返回;
 (1)通過呼叫ExitThread函式,執行緒將自己撤銷
 (2)同一個程序或者另一個程序中的執行緒呼叫TerminateThread函式終止另外一個執行緒的執行
 (3)包含執行緒的程序終止執行(主執行緒退出)。

1、 執行緒函式返回。

這是確保執行緒的所有資源被正確地清除的唯一辦法。當執行緒函式返回時,如下情況將會發生:
 線上程函式中建立的所有C++物件將通過它們的解構函式正確地撤銷;
作業系統將正確地釋放執行緒的堆疊使用的記憶體;
系統將執行緒的退出程式碼設定為執行緒函式的返回值;
系統遞減執行緒核心物件的引用計數。

2、 ExitThread函式。

可以通過線上程中呼叫ExitThread函式,來強制終止自身執行緒的執行。原型為:
VOID ExitThread(DWORD dwExitCode);

該函式將終止自身執行緒的執行,並導致作業系統清除該執行緒使用的所有作業系統資源。但是,C++資源(如C++物件)將不被正確地撤銷。由於這個原因,最好從執行緒函式返回,而不是通過呼叫ExitThread來返回。

3、 TerminateThread函式。呼叫TerminateThread函式將終止指定執行緒的執行,原型為:

BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);

//HANDLE hThread—將要終止的執行緒的控制代碼

//DWORD dwExitCode—傳遞給將要終止的執行緒的退出程式碼

與ExitThread不同,ExitThread是撤銷自身執行緒,而TerminateThread能夠撤銷任何執行緒。

要注意的是,TerminateThread是非同步執行的函式,也就是說,它告訴系統要終止指定執行緒的執行,但是該函式返回後,並不能保證指定的執行緒已經撤銷,如果要確切地知道被指定的執行緒是否已經被撤銷,請呼叫WaitForSingleObject等函式。
4、 程序終止執行(主執行緒退出)
5、 執行緒終止執行時,會發生下列操作:
執行緒擁有的所有USER物件控制代碼均被釋放。在Windows中,執行緒所建立的大部分物件歸它的程序所有。但是,執行緒也可以擁有兩個USER物件:視窗和鉤子。當建立這些物件的執行緒終止執行時,系統會自動釋放這些物件。其它對物件只有在程序終止時才被釋放;
執行緒的退出程式碼從STILL_ACTIVE改為執行緒函式返回值或者傳遞給ExitThread或者TerminateThread的程式碼;
執行緒核心物件的狀態變為通知(訊號)狀態
如果執行緒是程序中最後一個活動執行緒,程序也被終止;
執行緒核心物件的使用計數遞減1。
例1:
 執行緒的正常退出。注意!線上程中new出來的資源並不能隨著執行緒退出而自動釋放!!!
  1. class CTest  
  2. {  
  3. private:  
  4.     int m_iId;  
  5. public:  
  6.     CTest(int iId)  
  7.     {  
  8.         m_iId=iId;  
  9.     }  
  10.     virtual ~CTest()  
  11.     {  
  12.         TRACE("ID:%d ~CTest()\n",m_iId);  
  13.     }  
  14. };  
  15.    
  16. DWORD WINAPI SubThread(LPVOID lpParam)  
  17. {  
  18.     CTest obj(1),*pObj;  
  19.     pObj=new CTest(2); //注意,堆分配的資源並不隨著執行緒的退出而自動釋放
  20.     Sleep(500);  
  21.     return 999;  
  22. }  
  23.    
  24. void MainThread()  
  25. {  
  26.     DWORD dwRet;  
  27.     HANDLE hThread=CreateThread(NULL,0,SubThread,NULL,0,NULL);  
  28.     GetExitCodeThread(hThread,&dwRet);  
  29.     TRACE("SubThread exitcode:%d\n",dwRet);//很可能為STILL_ACTIVE
  30.     Sleep(1000);  
  31.     GetExitCodeThread(hThread,&dwRet);  
  32.     TRACE("SubThread exitcode:%d\n",dwRet);//很可能為999
  33.     CloseHandle(hThread);  
  34. }  
例2:
自身呼叫ExitThread退出執行緒
  1. class CTest  
  2. {  
  3. private:  
  4.     int m_iId;  
  5. public:  
  6.     CTest(int iId)  
  7.     {  
  8.         m_iId=iId;  
  9.     }  
  10.     virtual ~CTest()  
  11.     {  
  12.         TRACE("ID:%d ~CTest()\n",m_iId);  
  13.     }  
  14. };  
  15.    
  16. DWORD WINAPI SubThread(LPVOID lpParam)  
  17. {  
  18.     CTest obj(1),*pObj;   
  19.     pObj=new CTest(2); //注意,堆分配的資源並不隨著執行緒的退出而自動釋放
  20.     Sleep(500);  
  21.     ExitThread(1000); //接下來的返回語句將得不到執行,obj也不會被析構
  22.     return 999;   
  23. }  
  24.    
  25. void MainThread()  
  26. {  
  27.     DWORD dwRet;  
  28.     HANDLE hThread=CreateThread(NULL,0,SubThread,NULL,0,NULL);  
  29.     GetExitCodeThread(hThread,&dwRet);  
  30.     TRACE("SubThread exitcode:%d\n",dwRet);//很可能為STILL_ACTIVE
  31.     Sleep(1000);  
  32.     GetExitCodeThread(hThread,&dwRet);  
  33.     TRACE("SubThread exitcode:%d\n",dwRet);//很可能為1000
  34.     CloseHandle(hThread);  
  35. }  
例3:
呼叫TerminateThread來終止另外一個執行緒的執行。
  1. DWORD WINAPI SubThread(LPVOID lpParam)  
  2. {  
  3.     CTest obj(1),*pObj;   
  4.     pObj=new CTest(2); //注意,堆分配的資源並不隨著執行緒的退出而自動釋放
  5.     Sleep(500);  
  6.     return 999;   
  7. }  
  8.    
  9. void MainThread()  
  10. {  
  11.     DWORD dwRet;  
  12.     HANDLE

    相關推薦

    c++builder 執行-建立 退出 獲取執行返回

    1. WIN32 API執行緒的建立 在程式中呼叫CreateThread函式可以建立一個執行緒: HANDLE CreateThread(    LPSECURITY_ATTRIBUTES lpThreadAttributes,    D

    執行情況下,主執行退出,子執行會被強制退出

    1、程序中執行緒之間的關係 執行緒不像程序,一個程序中的執行緒之間是沒有父子之分的,都是平級關係。即執行緒都是一樣的, 退出了一個不會影響另外一個。 但是所謂的"主執行緒"main,其入口程式碼是類似這樣的方式呼叫main的:exit(main(...))。 main執行完

    Thread、執行建立、synchronized、執行生命週期

    程序:程序指正在執行的程式,當一個程式進入記憶體執行,即變成一個程序,程序是處於執行過程中的程式,並且具有一定獨立功能。 執行緒:執行緒是程序中的一個執行單元,負責當前程序中程式的執行,一個程序中至少有一個執行緒。 jvm啟動後,必然有一個執行路徑(執行緒)從main方法開始的,一直執行到main方法結束

    java 使用匿名內部類的方式建立執行並設定和獲取執行名字

    有些方法需要傳入介面的例項或者抽象類的例項物件,比如Thread有一個構造方法,Thread(Runnable target) 這時可以可以自定義類實現Runnable介面,重寫介面中的方法,將自定義類的物件傳入構造方法中 也可以使用匿名內部類,即在建立Thread物件時傳入Runnable

    Linux執行相關API基礎執行

    多執行緒:由程序生成,資源是程序給的,共享主執行緒資源,程序退出了,執行緒就沒有了                 1、執行緒的建立                     #include <pthread.h>                     int

    Linux最大執行數限制當前執行數查詢

    1、總結系統限制有:     /proc/sys/kernel/pid_max #查系統支援的最大執行緒數,一般會很大,相當於理論值     /proc/sys/kernel/thread-max     max_user_process(ulimit -u) #系統限制某

    執行 : 使用 Future 獲取執行返回結果

    import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.Execution

    執行】——Runnable如何獲取執行執行結果?

         由於Runnable裡的多執行緒是沒有返回結果的,那麼現在我想讓Runnable定義的多執行緒有返回結果和能夠拋 出異常該怎麼處理呢? 方案:     在java中提供了一個多執行緒

    Flink 叢集執行原理兼部署Yarn執行模式深入剖析-Flink牛刀小試

    版權宣告:本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。版權宣告:禁止轉載,歡迎學習。QQ郵箱地址:[email protected],如有任何問題,可隨時聯絡。 1 Flink的

    java根據執行的id去獲取執行

    import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; public

    C#呼叫批處理(bat)檔案,並獲取執行批處理(bat)檔案後返回

    /// /// 執行BAT檔案 /// /// csv檔案引數 /// bat檔案執行返回值 static string execBAT(string fileName) { ProcessStartInfo pro = new System.Diagnostics.ProcessStartInf

    Java執行狀態分析2:獲取執行堆疊資訊

    Java執行狀態分析2:獲取執行緒堆疊資訊 基本概念 出現記憶體洩漏或者執行緩慢場景,有時候無法直接從業務日誌看出問題時候

    C#關於執行執行同步 lock鎖的應用

    Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq;

    Java執行(一):執行基礎建立

    (一)、執行緒的生命週期 新建狀態: 使用 new 關鍵字和 Thread 類或其子類建立一個執行緒物件後,該執行緒物件就處於新建狀態。它保持這個狀態直到程式 start() 這個執行緒。 就緒狀態: 當執行緒物件呼叫了start()方法之後,該執行緒就進入就緒

    C++11執行程式設計 緒論總結

    C++11多執行緒程式設計 這一系列文章是從 https://thispointer.com/c11-multithreading-tutorial-series/ 轉過來的, 本來想翻譯一下, 但看了些內容, 用詞都不難, 讀英文沒有太大難度, 翻譯過來反而怕用詞不準畫蛇添

    C#_執行建立和使用

    1.在需要建立執行緒的方法中新增:new Thread(方法名).Start("資料"); 2.建立需要在新執行緒執行的方法: private void 方法名(object obj) { .....

    執行基礎知識(一) 執行的概念建立任務與執行

    執行緒的概念及建立任務與執行緒 引言 多執行緒使得程式中的多個任務可以同時執行。 java的重要功能之一就是內部支援多執行緒————在一個程式中運行同時執行多個任務。在許多程式設計語言中,多執行緒都是通過呼叫依賴於系統的過程或函式來實現的。在本文中,將介紹執行緒的該

    C語言執行基礎-01-執行建立與銷燬

    一.執行緒建立 首先要關聯標頭檔案Window.h,需要使用Windows系統的底層方法 1.1 執行緒建立演示: //定義一個方法,彈出一個訊息框 //該方法返回值為DWORD WINAPI型別,引數為一個空指標 DWORD WINAPI run(voi

    C++ Boost 執行(一),執行建立

    #include <iostream> #include <boost/thread.hpp> using namespace std; void func() { cou

    [C++][執行池][完整實現] 轉:執行池原理建立C++實現)

    文章的主要框架是參考這篇文件的,http://jacky-dai.iteye.com/blog/1090285, 關於作者  張中慶,西安交通大學軟體所,在讀碩士,目前研究方向為分散式網路與移動中介軟體,對Linux極其愛好,可以通過[email protecte