新聞中心
在向大家詳細(xì)介紹C#線(xiàn)程同步之前,首先讓大家了解下C#線(xiàn)程的中止,然后全面介紹C#線(xiàn)程同步。

C#線(xiàn)程的中止
由于能夠在沒(méi)有任何征兆的情況下使運(yùn)行的程序進(jìn)入一種混亂的狀態(tài),Java中的Thread.stop受到了普遍的反對(duì)。根據(jù)所調(diào)用的stop()方法,一個(gè)未經(jīng)檢查的java.lang.ThreadDeath錯(cuò)誤將會(huì)破壞正在運(yùn)行著的程序的棧,隨著它的不斷運(yùn)行,能夠解除任何被鎖定的對(duì)象。由于這些鎖被不分青紅皂白地被打開(kāi),由它們所保護(hù)的數(shù)據(jù)就非??赡芟萑牖靵y狀態(tài)中。
根據(jù)當(dāng)前的Java文檔,推薦的中止一個(gè)線(xiàn)程的方法是讓運(yùn)行的線(xiàn)程檢查一個(gè)由其他的線(xiàn)程能夠改變的變量,該變量代表一個(gè)“死亡時(shí)間”條件。下面的程序就演示了這種方法。
- // 條件變量
- private boolean timeToDie = false;
- // 在每次迭代中對(duì)條件變量進(jìn)行檢查。
- class StoppableRunnable
- extends Runnable {
- public void run() {
- while( !timeToDie ) {
- // 進(jìn)行相應(yīng)的操作
- }
- }
- }
上述的討論對(duì)C#中的Abort方法也適合。根據(jù)調(diào)用的Abort方法,令人捉摸不定的System.Threading.ThreadAbortException可能會(huì)破壞線(xiàn)程的棧,它可能釋放線(xiàn)程保持的一些變量,使處于保護(hù)狀態(tài)中的數(shù)據(jù)結(jié)構(gòu)出現(xiàn)不可預(yù)測(cè)的錯(cuò)誤。我建議使用與上面所示的相似的方法來(lái)通知一個(gè)應(yīng)該死亡的線(xiàn)程。
C#線(xiàn)程同步
從概念上來(lái)看,線(xiàn)程非常易于理解,實(shí)際上,由于他們可能交互地對(duì)同一數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作,因此它們成為了令編程人員頭疼的一種東西。以本文開(kāi)始的 ThreadingExample為例,當(dāng)它運(yùn)行時(shí),會(huì)在控制臺(tái)上輸出多種不同的結(jié)果。從 1 2 3 4 5 1 2 3 4 5到 1 1 2 2 3 3 4 4 5 5或 1 2 1 2 3 3 4 5 4 5在內(nèi)的各種情況都是可能出現(xiàn)的,輸出結(jié)果可能與操作系統(tǒng)的線(xiàn)程調(diào)度方式之間的差別有關(guān)。有時(shí),需要確保只有一個(gè)線(xiàn)程能夠訪問(wèn)一個(gè)給定的數(shù)據(jù)結(jié)構(gòu),以保證數(shù)據(jù)結(jié)構(gòu)的穩(wěn)定,這也是我們需要C#線(xiàn)程同步機(jī)制的原因所在。
為了保證數(shù)據(jù)結(jié)構(gòu)的穩(wěn)定,我們必須通過(guò)使用“鎖”來(lái)調(diào)整二個(gè)線(xiàn)程的操作順序。二種語(yǔ)言都通過(guò)對(duì)引用的對(duì)象申請(qǐng)一個(gè)“鎖”,一旦一段程序獲得該“鎖”的控制權(quán)后,就可以保證只有它獲得了這個(gè)“鎖”,能夠?qū)υ搶?duì)象進(jìn)行操作。同樣,利用這種鎖,一個(gè)線(xiàn)程可以一直處于等待狀態(tài),直到有能夠喚醒它信號(hào)通過(guò)變量傳來(lái)為止。
C#線(xiàn)程同步例子:
- public static Object synchronizeVariable = "locking variable";
- public static void count() {
- synchronized( synchronizeVariable ) {
- for( int count=1;count<=5;count++ ) {
- System.out.print( count + " " );
- synchronizeVariable.notifyAll();
- if( count < 5 )
- try {
- synchronizeVariable.wait();
- }
- catch( InterruptedException error ) {
- }
- }
- }
- }
新聞標(biāo)題:C#線(xiàn)程同步詳細(xì)分析
新聞來(lái)源:http://fisionsoft.com.cn/article/cdiddeg.html


咨詢(xún)
建站咨詢(xún)
