c++builder 多執行緒-建立 退出 及獲取執行緒返回碼
1. WIN32 API執行緒的建立
在程式中呼叫CreateThread函式可以建立一個執行緒:- HANDLE CreateThread(
- LPSECURITY_ATTRIBUTES lpThreadAttributes,
- DWORD dwStackSize,
- LPTHREAD_START_ROUTINE lpStartAddress,
- LPVOID lpParameter,
- DWORD dwCreationFlags,
- 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:建立執行緒,並傳遞引數:
- DWORD WINAPI SubThread(LPVOID lpParam)
- {
- TRACE("SubThread,lpParam is:%d\n",lpParam);
- return 0;
- }
- void MainThread()
- {
- HANDLE hThread=CreateThread(NULL,0,SubThread,(LPVOID)123,0,NULL);
- Sleep(1000);
- CloseHandle(hThread);
- }
建立掛起的新執行緒,老執行緒執行一些工作後,再啟用新建立的執行緒。
- DWORD WINAPI SubThread(LPVOID lpParam)
- {
- TRACE("SubThread,lpParam is:%d\n",lpParam);
- return 0;
- }
-
- void MainThread()
- {
- HANDLE hThread=CreateThread(NULL,0,SubThread,(LPVOID)123,CREATE_SUSPENDED,NULL);
- TRACE("SubThread is created\n");
- ResumeThread(hThread);
- Sleep(1000);
- CloseHandle(hThread);
- }
可以使用下面方法來終止執行緒:
執行緒函式的返回;
(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出來的資源並不能隨著執行緒退出而自動釋放!!!
- class CTest
- {
- private:
- int m_iId;
- public:
- CTest(int iId)
- {
- m_iId=iId;
- }
- virtual ~CTest()
- {
- TRACE("ID:%d ~CTest()\n",m_iId);
- }
- };
-
- DWORD WINAPI SubThread(LPVOID lpParam)
- {
- CTest obj(1),*pObj;
- pObj=new CTest(2); //注意,堆分配的資源並不隨著執行緒的退出而自動釋放
- Sleep(500);
- return 999;
- }
-
- void MainThread()
- {
- DWORD dwRet;
- HANDLE hThread=CreateThread(NULL,0,SubThread,NULL,0,NULL);
- GetExitCodeThread(hThread,&dwRet);
- TRACE("SubThread exitcode:%d\n",dwRet);//很可能為STILL_ACTIVE
- Sleep(1000);
- GetExitCodeThread(hThread,&dwRet);
- TRACE("SubThread exitcode:%d\n",dwRet);//很可能為999
- CloseHandle(hThread);
- }
自身呼叫ExitThread退出執行緒
- class CTest
- {
- private:
- int m_iId;
- public:
- CTest(int iId)
- {
- m_iId=iId;
- }
- virtual ~CTest()
- {
- TRACE("ID:%d ~CTest()\n",m_iId);
- }
- };
-
- DWORD WINAPI SubThread(LPVOID lpParam)
- {
- CTest obj(1),*pObj;
- pObj=new CTest(2); //注意,堆分配的資源並不隨著執行緒的退出而自動釋放
- Sleep(500);
- ExitThread(1000); //接下來的返回語句將得不到執行,obj也不會被析構
- return 999;
- }
-
- void MainThread()
- {
- DWORD dwRet;
- HANDLE hThread=CreateThread(NULL,0,SubThread,NULL,0,NULL);
- GetExitCodeThread(hThread,&dwRet);
- TRACE("SubThread exitcode:%d\n",dwRet);//很可能為STILL_ACTIVE
- Sleep(1000);
- GetExitCodeThread(hThread,&dwRet);
- TRACE("SubThread exitcode:%d\n",dwRet);//很可能為1000
- CloseHandle(hThread);
- }
呼叫TerminateThread來終止另外一個執行緒的執行。
- DWORD WINAPI SubThread(LPVOID lpParam)
- {
- CTest obj(1),*pObj;
- pObj=new CTest(2); //注意,堆分配的資源並不隨著執行緒的退出而自動釋放
- Sleep(500);
- return 999;
- }
-
- void MainThread()
- {
- DWORD dwRet;
-
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