C 多執行緒程式C

2021-09-19 04:16:49 字數 2445 閱讀 8664

#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...