1.**如下。
using2.結果如下圖。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"
))); } }
}
執行緒1,我們通過例項化物件來進行引數傳遞。
執行緒2,我們使用thread.start()來傳遞引數,不過此方法只接收單個引數,而且是物件型別。
執行緒3,我們使用lambda表示式進行引數傳遞,lambda表示式定義了乙個不屬於任何類的方法,同時該方法呼叫了我們實際要執行的方法,同時傳遞引數給執行緒。
執行緒4與執行緒5,則是顯示了使用lambda表示式進行引數傳遞的乙個問題,即當多個lambda表示式共用乙個變數時,它們會共享這個變數的值。如圖中線程4與執行緒5所顯示,沒有列印10,只列印了20。
十、使用lock鎖定操作
1.**如下
using2. 結果如下圖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()}}
}
主線程首先建立了乙個 counter的例項物件,這個類定義了乙個可以增,可以 減的簡單計數器。然後我們建立了三個執行緒,這三個執行緒共享乙個counter物件。由於沒有對共享變數的鎖定,所以在乙個週期內,對共享變數的改變,在上個執行緒沒結束之前,當前執行緒又對共享變數進行了操作,我們會得到不同的計數值,如上圖所示。為了防止這種情況的發生,所以我們要對共享變數進行加鎖。使用lock關鍵字鎖定物件,這樣在乙個執行緒操作完成之前,其他執行緒都不能對共享變數進行操作。
十一、moniter對資源的鎖定
1.**如下
using2.結果如下圖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)}}
}}
先看deadlock方法,這個方法先鎖定lock1物件,然後等待2秒之後,鎖定了lock2物件。然後在子執行緒中啟動了這個方法。
主線程中先鎖定了lock2物件,然後等待獲取lock1物件。由於子執行緒鎖定了lock1物件,等待lock2物件。所以造成了死鎖。
十二、多執行緒的異常處理
1.**如下
using2.結果如下圖。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));
} }}
}
在程式中定義了兩個處理異常的方法,乙個對異常進行了處理,另乙個沒有對異常進行處理。最後如圖。程式崩潰了。
多執行緒程式設計學習筆記 執行緒池(三)
接上文多執行緒程式設計學習筆記 執行緒池 一 接上文 多執行緒程式設計學習筆記 執行緒池 二 執行緒池還有乙個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,即把傳進...