国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

分析.NET上執(zhí)行多線程應(yīng)該注意的兩點_.Net教程

2024-07-10 12:50:56
字體:
供稿:網(wǎng)友

推薦:脫離.Net Framework框架運行.Net程序
.Net 框架目前逐步在普及了,仍然有很多人在尋找如何讓.Net程序脫離.NET框架的方法。 現(xiàn)成的工具有 Xenocode 的postbuidle或者vas,還有 Salamander .NET Linker . 另外還有 MaxToCode 作者以前做的 framework linker. 以及一些支持注冊表模擬和文件模擬的打

線程管理

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

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

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

以下為引用的內(nèi)容:

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)); }

}


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

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

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

以下為引用的內(nèi)容:

int x=5;

x=x 10;

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

以下為引用的內(nèi)容:

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#中是“鎖定”,這兩種語句都是把對象作為參數(shù)。其他嘗試鎖定相同對象實例使用的臨界區(qū)(包括上文所指的)會阻止運行直到鎖定解除,這樣每次就只有一個臨界區(qū)運行。我們先前舉例的一段代碼現(xiàn)在看起來是這樣的:

以下為引用的內(nèi)容:

int x=5;

object lockObject=new object();

Monitor.Enter(lockObject);

x=x 10;

Monitor.Exit(lockObject);


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

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

以下為引用的內(nèi)容:

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)用它們的第一段語句并且同時完成運行,那它們都無法調(diào)用它們的第二段語句——這就是一個死鎖。所以編寫代碼的時候細心,要仔細想清楚怎樣編寫代碼才更有利。死鎖的發(fā)生常見于新手,因為他們過分設(shè)置鎖定把它變得太詳細了。如果代碼被嵌套鎖定通常表明需要對編寫的代碼加以認真檢查。

分享:淺析asp.net 里 include UTF8 垃圾問題
暫且不討論為什么要用 SSI,而不用其它技術(shù)(如 UserControl) 生成 index.shtml 肯定要帶 BOM,其實帶不帶也不會影響頁面上會出現(xiàn)空白行。 index.shtml 內(nèi)容如下: html body !--#include file=head.shtml-- /body /html 1、head.shtml 保存為 UTF-8 帶 BOM

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 响水县| 桂东县| 新沂市| 延津县| 天水市| 新邵县| 静海县| 克拉玛依市| 全椒县| 当雄县| 虎林市| 新蔡县| 武功县| 郴州市| 新沂市| 荥阳市| 繁昌县| 南京市| 化德县| 高平市| 龙游县| 东光县| 四子王旗| 蛟河市| 河西区| 昭平县| 密山市| 沅陵县| 通道| 冕宁县| 九龙城区| 留坝县| 潞城市| 荥阳市| 东兰县| 濮阳市| 屯门区| 黄梅县| 绥化市| 阿克苏市| 得荣县|