偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

.NET上執(zhí)行多線程應(yīng)該注意的兩點(diǎn)

開發(fā) 后端
在初嘗多線程操作的甜頭后,總會(huì)想學(xué)習(xí)更多復(fù)雜的項(xiàng)目以便可以真正探索這個(gè)問題,并能充分利用其功能。通常,你所面臨的挑戰(zhàn)有兩個(gè):線程管理和數(shù)據(jù)完整性。

線程管理

線程管理現(xiàn)在變得越來越容易了。在.NET架構(gòu)中,你可以從線程池中獲取線程。線程池是一個(gè)生成線程的工廠,如果它已經(jīng)生成了一定數(shù)量的線程且還沒有被破壞的話,對(duì)它的調(diào)用會(huì)被阻止。但是,如何確保不會(huì)有太多的線程在規(guī)定時(shí)間內(nèi)運(yùn)行?畢竟,如果每個(gè)線程能夠占用一個(gè)CPU核的100%,那么有超過CPU核數(shù)量的線程運(yùn)行,只會(huì)導(dǎo)致操作系統(tǒng)啟動(dòng)線程時(shí)間分配,這將導(dǎo)致上下文切換和低效率運(yùn)行。換句話說,同一核上的兩個(gè)線程不會(huì)以兩倍的時(shí)長完成,可能需要用兩倍再加10%左右的時(shí)間來完成。與一個(gè)線程相比較的話,三個(gè)線程在同一核上想占用100%的CPU使用率可能會(huì)需要3.25—3.5倍的時(shí)長來完成。我的經(jīng)驗(yàn)是,每個(gè)核都有多個(gè)線程試圖占用100%的CPU,但它們都不能達(dá)到目標(biāo)。

所以,要怎樣分配正在運(yùn)行的線程數(shù)量呢?

有一個(gè)辦法是在線程之間建立一個(gè)共享的旗語對(duì)象。在線程開始運(yùn)行前,它會(huì)嘗試調(diào)用旗語的WaitOne模式,并在完成后釋放旗語。對(duì)CPU的核數(shù)量設(shè)置旗語限制,(使用EnvironmentProcessorCount功能限定);這將防止您的系統(tǒng)在同一時(shí)間運(yùn)行的線程數(shù)多于核數(shù)量。與此同時(shí),從線程池中拉出線程將確保您不會(huì)在同一時(shí)間創(chuàng)建過多線程。如果一次創(chuàng)建線程過多,即使他們并沒運(yùn)行,那也是浪費(fèi)系統(tǒng)資源。因?yàn)槊總€(gè)線程都要消耗資源。使用旗語的一般模式如下所示:

static Semaphore threadBlocker; 
static void Execute(object state)
{threadBlocker.WaitOne(); //Do work threadBlocker.Release(); }
static void RunThreads()
{threadBlocker = new Semaphore(0, Environment.ProcessorCount); 
for(int x = 0; x <= 2000; x++)
{ThreadPool.QueueUserWorkItem(new WaitCallback (Execute)); } 
}

當(dāng)然還有其他一些辦法可以解決這一問題。前一段時(shí)間我想要保持對(duì)象的一份清單。每個(gè)對(duì)象代表每個(gè)工人部件的完整狀態(tài)。執(zhí)行和完成時(shí),工人部件都會(huì)被填入數(shù)據(jù)。并且他會(huì)設(shè)置某個(gè)功能以指示任務(wù)完成。主線程將掃描對(duì)象清單,如果運(yùn)行的線程數(shù)量足夠少,就開始運(yùn)行另一個(gè)。說實(shí)話,雖然這個(gè)方法可行,但對(duì)于代碼和調(diào)試來說這絕對(duì)是個(gè)噩夢(mèng),所以我一點(diǎn)也不推薦。

數(shù)據(jù)完整性

總體而言,在數(shù)據(jù)完整性方面,你要擔(dān)心的問題是競爭條件和死鎖。多個(gè)線程試圖在同一時(shí)間更新相同的對(duì)象就會(huì)造成競爭條件,這將招致麻煩。想象一下如果使用下面這段代碼:

int x=5;

x=x+10;

現(xiàn)在,如果線程A和線程B在同一時(shí)間運(yùn)行此代碼,將會(huì)發(fā)生什么情況?它可以運(yùn)行得很好?還是會(huì)出現(xiàn)什么問題?如果出現(xiàn)問題,又是些怎樣的問題呢?每個(gè)線程都不會(huì)一次執(zhí)行全部語句。因此,我們可以按照以下順序操作:

1. Thread A retrieves the value of x (5).
2. Thread B retrieves the value of x (5).
3. Thread A assigns x + 10 (15) to x.
4. Thread B assigns x + 10 (15) to x.
5. x is now equal to 15.

或者,相同的代碼可以按照不同的順序:

1. Thread A retrieves the value of x (5).
2. Thread A assigned x = 10 (15) to x.
3. Thread B retrieves the value of x (15).
4. Thread B assigns x + 10 (25) to x.
5. x is now equal to 25.

在.NET架構(gòu)中,最簡單也最常見的解決競爭條件的方法是使用“臨界區(qū)”。而在VB.NET中,該語句是“加鎖”,并在C#中是“鎖定”,這兩種語句都是把對(duì)象作為參數(shù)。其他嘗試鎖定相同對(duì)象實(shí)例使用的臨界區(qū)(包括上文所指的)會(huì)阻止運(yùn)行直到鎖定解除,這樣每次就只有一個(gè)臨界區(qū)運(yùn)行。我們先前舉例的一段代碼現(xiàn)在看起來是這樣的:

int x=5; 
object lockObject=new object();
Monitor.Enter(lockObject);
x=x+10;
Monitor.Exit(lockObject);

什么是監(jiān)控器可以提供而臨界區(qū)做不到的呢?答案是沒有。除非你在解鎖后需要更細(xì)粒度的控制權(quán)。有些復(fù)雜的代碼可能需要鎖定或長或短的一段時(shí)間,這都取決于運(yùn)行的情況,比方一個(gè)變量的值。在這種情況下,選擇監(jiān)控器要比需選擇臨界區(qū)更合適。

另一個(gè)值得關(guān)注的有關(guān)數(shù)據(jù)完整性的問題是死鎖。當(dāng)多個(gè)線程鎖定資源導(dǎo)致它們都不能夠繼續(xù)運(yùn)行時(shí),就會(huì)出現(xiàn)死鎖。例如:

Thread A: 
Monitor.Enter(object1);
Monitor.Enter(object2);
//Do work
Monitor.Exit(object1);
Monitor.Exit(object2);
Thread B:
Monitor.Enter(object2);
Monitor.Enter(object1);
//Do work
Monitor.Exit(object1);
Monitor.Exit(object2);

如果線程A和線程B都調(diào)用它們的第一段語句并且同時(shí)完成運(yùn)行,那它們都無法調(diào)用它們的第二段語句——這就是一個(gè)死鎖。所以編寫代碼的時(shí)候細(xì)心,要仔細(xì)想清楚怎樣編寫代碼才更有利。死鎖的發(fā)生常見于新手,因?yàn)樗麄冞^分設(shè)置鎖定把它變得太詳細(xì)了。如果代碼被嵌套鎖定通常表明需要對(duì)編寫的代碼加以認(rèn)真檢查。

【編輯推薦】

  1. .NET中異常處理的幾個(gè)誤區(qū)
  2. 使用Ja.Net實(shí)現(xiàn)Java和.NET的完美互用
  3. 基于.NET平臺(tái)的分層架構(gòu)實(shí)戰(zhàn)
責(zé)任編輯:田超 來源: IT專家網(wǎng)論壇
相關(guān)推薦

2009-07-16 09:25:27

Java常量定義

2018-08-28 06:21:19

網(wǎng)線布線線纜

2021-08-26 14:55:55

開發(fā)React代碼

2012-11-12 09:26:06

.NET多線程

2013-01-05 14:25:27

大數(shù)據(jù)

2011-04-29 08:46:58

C#代碼規(guī)范

2010-03-18 16:02:09

python 多線程

2021-05-28 17:33:33

5G5G網(wǎng)絡(luò)工業(yè)互聯(lián)網(wǎng)

2009-07-28 15:30:34

ASP.NET多線程

2015-08-03 10:25:58

C語言特性不為人知

2010-04-14 09:20:26

.NET多線程

2024-04-30 12:56:00

多線程.NET

2012-08-23 11:18:15

2009-12-30 14:14:39

PPPoA體系

2022-04-10 23:07:21

瀏覽器FirefoxLinux

2010-05-13 11:12:59

統(tǒng)一通信平臺(tái)

2010-02-02 09:54:05

軟交換技術(shù)

2009-08-31 14:45:15

C#.NET多線程應(yīng)用

2010-03-17 15:45:13

無線設(shè)備兼容性

2009-07-01 14:49:52

JSP空間租用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)