如何在C 中編寫多執行緒應用程式

2021-04-16 09:40:13 字數 3632 閱讀 5855

以前在使用vb來實現多執行緒的時候,發現有一定的難度。雖然也有這樣那樣的方法,但都不盡人意,但在c#中,要編寫多執行緒應用程式卻相當的簡單。這篇文章將作簡要的介紹,以起到拋磚引玉的作用!

.net將關於多執行緒的功能定義在system.threading名字空間中。因此,要使用多執行緒,必須先宣告引用此名字空間(using system.threading;)。

即使你沒有編寫多執行緒應用程式的經驗,也可能聽說過「啟動執行緒」「殺死執行緒」這些詞,其實除了這兩個外,涉及多執行緒方面的還有諸如「暫停執行緒」「優先順序」「掛起執行緒」「恢復執行緒」等等。下面將乙個乙個的解釋。

a.啟動執行緒

顧名思義,「啟動執行緒」就是新建並啟動乙個執行緒的意思,如下**可實現:

thread thread1 = new thread(new threadstart( count));

其中的 count 是將要被新執行緒執行的函式。

b.殺死執行緒

「殺死執行緒」就是將一線程斬草除根,為了不白費力氣,在殺死乙個執行緒前最好先判斷它是否還活著(通過 isalive 屬性),然後就可以呼叫 abort 方法來殺死此執行緒。

c.暫停執行緒

它的意思就是讓乙個正在執行的執行緒休眠一段時間。如 thread.sleep(1000); 就是讓執行緒休眠1秒鐘。

d.優先順序

這個用不著解釋了。thread類中有乙個threadpriority屬性,它用來設定優先順序,但不能保證作業系統會接受該優先順序。乙個執行緒的優先順序可分為5種:normal, abovenormal, belownormal, highest, lowest。具體實現例子如下:

thread.priority = threadpriority.highest;

e.掛起執行緒

thread類的suspend方法用來掛起執行緒,知道呼叫resume,此執行緒才可以繼續執行。如果執行緒已經掛起,那就不會起作用。

if (thread.threadstate = threadstate.running)

f.恢復執行緒

用來恢復已經掛起的執行緒,以讓它繼續執行,如果執行緒沒掛起,也不會起作用。

if (thread.threadstate = threadstate.suspended)

下面將列出乙個例子,以說明簡單的執行緒處理功能。此例子來自於幫助文件。

using system;

using system.threading;

// ****** threading scenario:  start a static method running

// on a second thread.

public class threadexample ", i);

// yield the rest of the time slice.

thread.sleep(0);}}

public static void main()

console.writeline("main thread: call join(), to wait until threadproc ends.");

t.join();

console.writeline("main thread: threadproc.join has returned.  press enter to end program.");

console.readline();}}

此**產生的輸出類似如下內容:

main thread: start a second thread.

main thread: do some work.

threadproc: 0

main thread: do some work.

threadproc: 1

main thread: do some work.

threadproc: 2

main thread: do some work.

threadproc: 3

main thread: call join(), to wait until threadproc ends.

threadproc: 4

threadproc: 5

threadproc: 6

threadproc: 7

threadproc: 8

threadproc: 9

main thread: threadproc.join has returned.  press enter to end program.

2.當執行緒sleep時,系統就退出執行佇列一段時間,當睡眠結束時,系統會產生乙個時鐘中斷,從而

使執行緒回到執行佇列中,從而恢復執行緒的執行。

3.如果父執行緒先於子執行緒結束,那麼子執行緒將在父執行緒結束的同時被迫結束。thread.join()方法使父執行緒等待,直到子執行緒結束。

abort()方法帶來的後果是不可恢復的終止執行緒。

4.起始執行緒可以稱之為主線程,如果所有的前台執行緒都停止了,那麼主線程可以終止,而所有的後台執行緒都將無條件終止。

後台執行緒跟前臺執行緒只有乙個區別,那就是後台執行緒不妨礙程式的終止。一旦乙個程序所有的前台執行緒都終止後,clr

將通過呼叫任意乙個存活中的後台程序的abort()方法來徹底終止程序。

6.掛起,睡眠(都可稱為--阻塞,暫停)

與thread.sleep 不同,thread.suspend 不會使執行緒立即停止執行。直到執行緒到達安全點之後它才可以將該執行緒掛起。如果執行緒尚

未啟動或已經停止,則它將不能掛起。呼叫 thread.resume 將使另乙個執行緒跳出掛起狀態並使該執行緒繼續執行。

乙個執行緒不能對另乙個執行緒呼叫sleep ,但是乙個執行緒可以對另乙個執行緒呼叫suspend。

還可以使用許多其它的方式來阻塞執行緒。例如,可以通過呼叫 thread.join 使乙個執行緒等待另乙個執行緒(子執行緒)停止。使用

monitor.wait使乙個執行緒等待訪問乙個同步物件。

5.關鍵字lock可以把一段**定義為互斥段(critical section),互斥段在乙個時刻內只允許乙個執行緒進入執行,而其他執行緒必須等待。

多執行緒公用乙個物件時,就不應該使用lock關鍵字了,這裡monitor,monitor提供了使執行緒共享資源的方案。

monitor類可以鎖定乙個物件,乙個執行緒只有得到這把鎖才可以對該物件進行操作。

如:monitor.enter(obj);

//現在oqueue物件只能被當前執行緒操縱了

monitor.exit(obj);

6.乙個程序開始時至少會有乙個主線程 ( 即主執行例項 ) ,這是在系統載入你的程式的時候所建立的主執行流程。

訊息佇列是在什麼時候生成的呢? 在似win2k系統上,從一開始建立執行緒就已經有了。

乙個執行緒可以建立多個窗體。統傳送給這些視窗的訊息都統一傳送到同乙個 訊息佇列 中,幸虧訊息結構中有msg.hwnd指出該條訊息與

哪乙個視窗相關, dispatchmessage() 函式就是依照這個保證訊息分派處理自動化而且不會出錯!

7.每個窗體都屬於建立它的執行緒,在一線程中直接訪或間接問其它執行緒中的窗體的方法將導致執行時錯誤(vs2005)。

解決方法:使用窗體從control繼承而來的control.invoke(delegate)方法。該方法將在建立窗體的執行緒上執行委託指向的方法。

注意:在vs2003下,可以在乙個執行緒中直接或間接呼叫另乙個執行緒中的窗體的方法,而不會導致執行時錯誤。 

在C 中編寫多執行緒應用程式

以前在使用vb來實現多執行緒的時候,發現有一定的難度。雖然也有這樣那樣的方法,但都不盡人意,但在c 中,要編寫多執行緒應用程式卻相當的簡單。這篇文章將作簡要的介紹,以起到拋磚引玉的作用!net將關於多執行緒的功能定義在system.threading名字空間中。因此,要使用多執行緒,必須先宣告引用此...

在C 中編寫多執行緒應用程式

來自 kunwsoft.以前在使用vb來實現多執行緒的時候,發現有一定的難度。雖然也有這樣那樣的方法,但都不盡人意,但在c 中,要編寫多執行緒應用程式卻相當的簡單。這篇文章將作簡要的介紹,以起到拋磚引玉的作用!將關於多執行緒的功能定義在system.threading名字空間中。因此,要使用多執行緒...

在C 中編寫多執行緒應用程式

來自 kunwsoft.以前在使用vb來實現多執行緒的時候,發現有一定的難度。雖然也有這樣那樣的方法,但都不盡人意,但在c 中,要編寫多執行緒應用程式卻相當的簡單。這篇文章將作簡要的介紹,以起到拋磚引玉的作用!將關於多執行緒的功能定義在system.threading名字空間中。因此,要使用多執行緒...