溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何理解C#特有線程功能

發(fā)布時(shí)間:2021-06-16 11:36:36 來(lái)源:億速云 閱讀:146 作者:chen 欄目:編程語(yǔ)言

本篇內(nèi)容介紹了“如何理解C#特有線程功能”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

C#特有線程功能

C#特有線程功能,我們一直對(duì)C#抱有很高的期望,C#中確實(shí)有一些Java不支持的方法、類(lèi)和函數(shù),對(duì)于鐵桿的Java線程編程人員而言,這可是一件好事,因?yàn)樗麄兛梢杂肅#編寫(xiě)代碼,然后在Java代碼中引用。

要在Java中獲得某一變量的鎖,必須在代碼的首尾二端加上synchronized關(guān)健字,指明需要獲得鎖的對(duì)象。一旦線程開(kāi)始執(zhí)行 synchronized塊中的代碼,它就獲得了對(duì)這一對(duì)象的鎖的控制權(quán)。同樣,一旦線程已經(jīng)離開(kāi)了synchronized塊,它也將釋放這一對(duì)象的鎖。我們已經(jīng)知道,C#也有一個(gè)相似的被稱(chēng)作lock的關(guān)健字。除了lock這個(gè)關(guān)健字外,C#還提供了內(nèi)置的獲得和釋放鎖的方法:Monitor.Enter(object obj)和Monitor.Exit(object obj),通過(guò)使用這些方法,編程人員可以獲得與使用lock相同的作用,但提供了更精確的控制方法。例如,可以在一個(gè)方法中鎖定幾個(gè)變量,而不同時(shí)或在代碼中的不同部分釋放它們。

對(duì)一個(gè)需要進(jìn)行同步的對(duì)象執(zhí)行System.Threading.Monitor.Enter操作將使線程獲得該對(duì)象的鎖,或者在由其他線程控制著該對(duì)象的鎖時(shí)進(jìn)行阻塞。通過(guò)執(zhí)行Monitor.Exit方法就可以釋放鎖,如果線程已經(jīng)不控制著該對(duì)象的鎖了,這一方法將會(huì)產(chǎn)生一個(gè) System.Threading.SynchronizationLockException異常信號(hào)。

C#中的Monitor類(lèi)不但包括Enter方法,還包括TryEnter方法,如果執(zhí)行該方法,就會(huì)或者獲得一個(gè)鎖,或者返回一個(gè)表明它不能獲得鎖的返回值。

原子操作

System.Threading.Interlocked類(lèi)提供了程序?qū)τ蓭讉€(gè)線程共享的變量進(jìn)行同步訪問(wèn)的能力,C#把一些操作抽象為“原子”操作或“不可分割”的操作。為了說(shuō)明這一問(wèn)題是如何解決的,我們來(lái)看一下下面的Java代碼:

public static int x = 1;  public static void increment() {  xx = x 1;  }

如果有二個(gè)不同的線程同時(shí)調(diào)用increment(),x***的值可能是2或3,發(fā)生這種情況的原因可能是二個(gè)進(jìn)程無(wú)序地訪問(wèn)x變量,在沒(méi)有將x置初值時(shí)對(duì)它執(zhí)行加1操作;在任一線程有機(jī)會(huì)對(duì)x執(zhí)行加1操作之前,二個(gè)線程都可能將x讀作1,并將它設(shè)置為新的值。

在Java和C#中,我們都可以實(shí)現(xiàn)對(duì)x變量的同步訪問(wèn),所有進(jìn)程都可以按各自的方式運(yùn)行。但通過(guò)使用Interlocked類(lèi),C#提供了一個(gè)對(duì)這一問(wèn)題更徹底的解決方案。Interlocked類(lèi)有一些方法,例如Increment(ref int location)、Decrement(ref int location),這二個(gè)方法都取得整數(shù)型參數(shù),對(duì)該整數(shù)執(zhí)行加或減1操作,并返回新的值,所有這些操作都以“不可分割的”方式進(jìn)行,這樣就無(wú)需單***建一個(gè)可以進(jìn)行同步操作的對(duì)象,如下例所示:

public static Object locker = ...  public static int x = 1;  public static void increment() {  synchronized( locker ) {  xx = x 1;  }  }

C#中的Interlocked類(lèi)可以用下面的代碼完成相同的操作:

public static int x = 1;   public static void Increment() {  Interlocked.Increment( ref x );   }

Interlocked中還包括一個(gè)名字為Exchange的方法,可以“不可分割”地將一個(gè)變量的值設(shè)置為另一個(gè)變量的值。

線程池

如果許多利用了線程的應(yīng)用軟件都創(chuàng)建線程,這些線程將會(huì)因等待某些條件(鍵盤(pán)或新的I/O輸入等)而在等待狀態(tài)中浪費(fèi)大部分的時(shí)間,C#提供的 System.Threading.ThreadPool對(duì)象可以解決這一問(wèn)題。使用ThreadPool和事件驅(qū)動(dòng)的編程機(jī)制,程序可以注冊(cè)一個(gè) System.Threading.WaitHandle對(duì)象(WaitHandle是C#編程中等待和通知機(jī)制的對(duì)象模型)和 System.Threading.WaitOrTimerCallback對(duì)象,所有的線程無(wú)需自己等待WaitHandle的釋放,ThreadPool將監(jiān)控所有向它注冊(cè)的WaitHandle,然后在WaitHandle被釋放后調(diào)用相應(yīng) WaitOrTimerCallback對(duì)象的方法。 

“如何理解C#特有線程功能”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI