#include #include using namespace std;
//因為要訪問windows api函式,所以要包含windows.h標頭檔案。
dword winapi fun1proc(
lpvoid lpparameter//thread data
);void main()
{ handle hthread1;
hthread1=createthread(null,0,fun1proc,null,0,null);
closehandle(hthread1);
cout<
關閉執行緒控制代碼,並沒有終止新建立的執行緒,只是表示在主線程當中,對新建立的執行緒的引用不感興趣,所以將它關閉,關閉控制代碼,系統會遞減執行緒的執行緒核心物件的使用計數,建立的執行緒執行完畢後,系統也會遞減執行緒核心物件的使用計數。當使用計數為0,系統會釋放執行緒核心物件。
在主線程中,如果不關閉,始終會保留乙個引用。
縣城核心物件的使用計數就不會為0,即使執行緒執行完畢,執行緒核心物件也不會被釋放,只有等到程序終止時系統才會為這些殘留物件做清理工作。
所以我們應該在不再使用執行緒的控制代碼的時候將其關閉,讓執行緒核心物件的引用計數減1。
執行結果
執行發現只有一句main thread is running !
並沒有看到執行緒1正在執行這句話,是為什麼呢?
是因為我們建立失敗嗎?
顯然不是。
當我們建立之後,對於主線程,它是因為作業系統給它分配了時間片所以它才能執行。
它在它執行的時間段之內,建立執行緒之後關閉控制代碼輸出這句話,然後主線程就執行完成了。
當主線程執行完成後,它就退出了。
那麼主線程退出,程序就要退出,當程序退出,
程序中的所有資源包括一些沒有執行的執行緒都要退出,即新建立的執行緒還沒有得到執行的機會就已經退出了。
所以我們沒有看到thread1 is running !這一句話的輸出,要想看到執行緒1的執行,我們不能讓主線程退出。
我們可以在主線程中,當它輸出這句話後。讓主線程暫停執行。
當主線程暫停執行,表示它放棄了執行的權利,作業系統會從等待執行的執行緒當中選擇乙個執行緒來執行。
這個時候,我們新建立的執行緒就可以得到執行的機會,從而列印出thread1 is running !
要讓主線程暫停,用函式sleep(sleep time)
sleep函式是暫停當前執行緒指定時間間隔的執行,時間以毫秒為單位。
#include #include using namespace std;
//因為要訪問windows api函式,所以要包含windows.h標頭檔案。
重新執行,發現主線程和執行緒1都執行了。
下面我們加上while迴圈,看一下執行緒交替的情況。
定義乙個變數,當變數值遞增到乙個範圍就停止執行。
將sleep(10)注釋掉。
#include #include using namespace std;
//因為要訪問windows api函式,所以要包含windows.h標頭檔案。
看到當主線程它執行一段時間後(在自己的時間片內執行),時間片到期之後,作業系統會選擇執行緒1開始執行,同樣為執行緒1分配乙個時間片。執行緒1執行一段時間後,它的時間片到期了,作業系統又會選擇主線程開始執行。
於是,我們看到主線程和執行緒1 在交替執行。
這就是主線程和執行緒1這兩個執行緒在單cpu平台下的交替執行。
多cpu平台下,主線程和新建立的執行緒1就可以真正的併發執行了。
使用C 多執行緒程式(2)
為了防止應用程式崩潰可以在可能發生異常的地方捕獲異常。可能在sleep方法中丟擲異常,可以用try來捕獲所有的異常。program 9 using system using system.threading using system.security public class mythread ca...
使用C 多執行緒程式(2)
為了防止應用程式崩潰可以在可能發生異常的地方捕獲異常。可能在sleep方法中丟擲異常,可以用try來捕獲所有的異常。program 9 using system using system.threading using system.security public class mythread ca...
C 多執行緒強制退出程式
最近在學習多執行緒程式的開發,但是啟動了多個執行緒的程式在關閉的時候卻出現了問題,如果程式退出的時候不關閉執行緒,那麼執行緒就會一直的存在,但是大多啟動的執行緒都是區域性變數,不能一一的關閉,如果呼叫thread.currentthread.abort 方法關閉主線程的話,就會出現threadabo...