多執行緒程式設計學習筆記 基礎(三)

2022-02-09 07:43:29 字數 4199 閱讀 3818

1.**如下。

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using system.threading; //

引入執行緒

using

system.diagnostics;

namespace

static

void countnumber(int

cnt)

列印 數字

", thread.currentthread.name, i.tostring("n0"

)));}}

static

void count(object

cnt)

static

void printnumber(int

num)

列印 數字

", thread.currentthread.name, num.tostring("n0"

))); } }

}

2.結果如下圖。

執行緒1,我們通過例項化物件來進行引數傳遞。

執行緒2,我們使用thread.start()來傳遞引數,不過此方法只接收單個引數,而且是物件型別。

執行緒3,我們使用lambda表示式進行引數傳遞,lambda表示式定義了乙個不屬於任何類的方法,同時該方法呼叫了我們實際要執行的方法,同時傳遞引數給執行緒。

執行緒4與執行緒5,則是顯示了使用lambda表示式進行引數傳遞的乙個問題,即當多個lambda表示式共用乙個變數時,它們會共享這個變數的值。如圖中線程4與執行緒5所顯示,沒有列印10,只列印了20。

十、使用lock鎖定操作

1.**如下

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using system.threading; //

引入執行緒

using

system.diagnostics;

namespace

",c.count));

console.writeline(

"----------------------------");

var c1 = new

counterlock();

var t4 = new thread(() =>count(c1));

t4.name = "

執行緒4"

;

var t5 = new thread(() =>count(c1));

t5.name = "

執行緒5"

;

var t6 = new thread(() =>count(c1));

t6.name = "

執行緒6"

; t4.start();

t5.start();

t6.start();

t4.join();

t5.join();

t6.join();

console.writeline(

string.format("

加鎖的多執行緒總計:

", c1.count));

console.read();

}

static

void

count(countbase cnt)}}

abstract

class

countbase

class

counter : countbase

public

override

void

dncerement()

public

override

void

incerement()

}class

counterlock : countbase

public

override

void

dncerement()

}public

override

void

incerement()}}

}

2. 結果如下圖

主線程首先建立了乙個 counter的例項物件,這個類定義了乙個可以增,可以 減的簡單計數器。然後我們建立了三個執行緒,這三個執行緒共享乙個counter物件。由於沒有對共享變數的鎖定,所以在乙個週期內,對共享變數的改變,在上個執行緒沒結束之前,當前執行緒又對共享變數進行了操作,我們會得到不同的計數值,如上圖所示。為了防止這種情況的發生,所以我們要對共享變數進行加鎖。使用lock關鍵字鎖定物件,這樣在乙個執行緒操作完成之前,其他執行緒都不能對共享變數進行操作。

十一、moniter對資源的鎖定

1.**如下

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using system.threading; //

引入執行緒

using

system.diagnostics;

namespace

else

}new thread(() =>deadlock(lock1, lock2)).start();

console.writeline(

"-----------------------------");

lock

(lock2)

}console.read();

}//////

死鎖方法

/// ///

///static

void deadlock(object objlock1,object

objlock2)}}

}}

2.結果如下圖

先看deadlock方法,這個方法先鎖定lock1物件,然後等待2秒之後,鎖定了lock2物件。然後在子執行緒中啟動了這個方法。

主線程中先鎖定了lock2物件,然後等待獲取lock1物件。由於子執行緒鎖定了lock1物件,等待lock2物件。所以造成了死鎖。

十二、多執行緒的異常處理

1.**如下

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using system.threading; //

引入執行緒

using

system.diagnostics;

namespace

catch

(exception ex)

console.read();

}

static

void

expectthread()

static

void

faultythread()

catch

(exception ex)

",ex.message));

} }}

}

2.結果如下圖。

在程式中定義了兩個處理異常的方法,乙個對異常進行了處理,另乙個沒有對異常進行處理。最後如圖。程式崩潰了。

多執行緒程式設計學習筆記 執行緒池(三)

接上文多執行緒程式設計學習筆記 執行緒池 一 接上文 多執行緒程式設計學習筆記 執行緒池 二 執行緒池還有乙個threadpool.registerwaitforsingleobject,這個方法允許我們將 函式放入執行緒池中的佇列中。當提供的等待事件處理器接收到訊號或發生超時時,這個 函式將被呼叫...

多執行緒程式設計學習筆記 基礎(二)

1.如下 using system using system.collections.generic using system.linq using system.text using system.threading 引入執行緒 namespace static void printnumber ...

C 多執行緒基礎學習筆記(三)

一 detach 大坑 由監檢視可知,實參n和形參a的位址並不同,所以實際是值傳遞,並因此最好不要用引用,直接用值傳遞就行了。主線程的str m和str的位址卻相同,那麼當子執行緒和主線程分離時,就會出現問題。這裡講乙個改進的方法,把形參char str改成const string str,即把傳進...