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

首頁 > 編程 > .NET > 正文

在.NET上執(zhí)行多線程操作要考慮的兩大因素_.Net教程

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

推薦:Flex與.NET互操作:基于WebService的數(shù)據(jù)訪問
Flex提供了mx:WebService、mx:HTTPService和mx:RemoteObject標簽來直接訪問遠程數(shù)據(jù),這用于與各種不同語言環(huán)境開發(fā)提供的遠程服務端數(shù)據(jù)源(如WebService)進行數(shù)據(jù)交互通信顯得更加容易. 本文以.NET平臺下C#語言開發(fā)的WebService作為遠程數(shù)據(jù)源,詳細介紹Fl

線程管理

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

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

有一個辦法是在線程之間建立一個共享的旗語對象。在線程開始運行前,它會嘗試調(diào)用旗語的WaitOne模式,并在完成后釋放旗語。對CPU的核數(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〉清單。每個對象代表每個工人部件的完整狀態(tài)。執(zhí)行和完成時,工人部件都會被填入數(shù)據(jù)。并且他會設置某個功能以指示任務完成。主線程將掃描對象清單,如果運行的線程數(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.

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

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

  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應用程序中進行Erlang風格的并行編程
Erlang能夠用來編寫高度可伸縮的并行應用程序,其中經(jīng)常會出現(xiàn)數(shù)以百萬計的輕量級組件,這種類似于線程的組件被稱之為actor。不幸的是,這往往需要您使用Erlang這種相對神秘的編程語言重寫所有代碼。不過我們也有其他選擇,例如使用名不見經(jīng)傳的CCR平臺來進

共2頁上一頁12下一頁
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 临高县| 车险| 库伦旗| 梧州市| 武穴市| 三亚市| 武强县| 于田县| 陈巴尔虎旗| 雷州市| 娱乐| 乌恰县| 榆社县| 建德市| 电白县| 东至县| 文登市| 招远市| 乌海市| 筠连县| 赣州市| 辽宁省| 永定县| 和田市| 五峰| 清水河县| 湟源县| 安福县| 定结县| 望谟县| 钦州市| 广德县| 三江| 耒阳市| 通辽市| 水富县| 钟祥市| 兴隆县| 铜陵市| 图片| 邢台市|