C 多執行緒的自動管理 執行緒池

2021-07-13 04:12:53 字數 3331 閱讀 9912

c# 多執行緒的自動管理(執行緒池)

在多執行緒的程式中,經常會出現兩種情況:

1. 應用程式中線程把大部分的時間花費在等待狀態,等待某個事件發生,然後給予響應。這一般使用 threadpool(執行緒池)來解決。 

2. 執行緒平時都處於休眠狀態,只是周期性地被喚醒。這一般使用 timer(定時器)來解決。

threadpool 類提供乙個由系統維護的執行緒池(可以看作乙個執行緒的容器),該容器需要 windows 2000 以上系統支援,因為其中某些方法呼叫了只有高版本的windows 才有的 api 函式。

threadpool 的用法:

首先程式建立了乙個 manualresetevent 物件,該物件就像乙個訊號燈,可以利用它的訊號來通知其它執行緒。本例中,當執行緒池中所有執行緒工作都完成以後,manualresetevent 物件將被設定為有訊號,從而通知主線程繼續執行。

manualresetevent 物件有幾個重要的方法:

初始化該物件時,使用者可以指定其預設的狀態(有訊號/無訊號);

在初始化以後,該物件將保持原來的狀態不變,直到它的 reset() 或者 set() 方法被呼叫:

reset():

將其設定為無訊號狀態;

set():

將其設定為有訊號狀態。

waitone():

使當前執行緒掛起,直到 manualresetevent 物件處於有訊號狀態,此時該執行緒將被啟用。然後,程式將向執行緒池中新增工作項,這些以函式形式提供的工作項被系統用來初始化自動建立的執行緒。當所有的執行緒都執行完了以後,manualresetevent.set() 方法被呼叫,因為呼叫了 manualresetevent.waitone() 方法而處在等待狀態的主線程將接收到這個訊號,於是它接著往下執行,完成後邊的工作。

using system.collections;
using system.threading;
namespace threadexample
}
public

class alpha

///
/// 執行緒池裡的執行緒將呼叫 beta()方法
/// 

/// 

public

void beta(object state)

:", thread.currentthread.gethashcode(), ((somestate)state).cookie);
console.writeline("hashcount.count==, thread.currentthread.gethash code()==", hashcount.count,
thread.currentthread.gethashcode());
lock (hashcount)
thread.sleep(2000);
// interlocked.increment() 操作是乙個原子操作,具體請看下面說明
interlocked.increment(ref icount);
if (icount == imaxcount)
}
}
public

class ******pool

items to thread pool", maxcount);
// 注意初始化 oalpha 物件的 eventx 屬性
alpha oalpha = new alpha(maxcount);
oalpha.eventx = eventx;
console.writeline("queue to thread pool 0");
try
catch (notsupportedexception)
if (w2k) // 如果當前系統支援 threadpool 的方法.
", iitem);
threadpool.queueuserworkitem(new waitcallback(oalpha.beta), new somestate(iitem));
}
console.writeline("waiting for thread pool to drain");
// 等待事件的完成,即執行緒呼叫 manualresetevent.set() 方法
eventx.waitone(timeout.infinite, true);
// waitone() 方法使呼叫它的執行緒等待直到 eventx.set() 方法被呼叫
console.writeline("thread pool has been drained (event fired)");
console.writeline();
console.writeline("load across threads");
foreach (object o in oalpha.hashcount.keys)
", o, oalpha.hashcount[o]);
}
}
console.readline();
}
}
}
程式中應該引起注意的地方:

somestate 類是乙個儲存資訊的資料結構,它作為引數被傳遞給每乙個執行緒,因為你需要把一些有用的資訊封裝起來提供給執行緒,而這種方式是非常有效的。

程式出現的 interlocked 類也是專為多執行緒程式而存在的,它提供了一些有用的原子操作。原子操作:就是在多執行緒程式中,如果這個執行緒呼叫這個操作修改乙個變數,那麼其他執行緒就不能修改這個變數了,這跟 lock 關鍵字在本質上是一樣的。

分類:

.net 技術

好文要頂

關注我收藏該文

聯絡我

skysoot

關注 - 0

粉絲 - 145

+加關注2 0

(請您對文章做出評價)

c# 檔案與目錄的基本操作(system.io)

c# 多執行緒詳解 part.03 (定時器)

C 多執行緒 四 多執行緒的自動管理 執行緒池

在多執行緒的程式中,經常會出現兩種情況 一種情況 應用程式中,執行緒把大部分的時間花費在等待狀態,等待某個事件發生,然後才能給予響應 這一般使用threadpool 執行緒池 來解決 另一種情況 執行緒平時都處於休眠狀態,只是周期性地被喚醒 這一般使用timer 定時器 來解決 threadpool...

C 多執行緒學習 四 多執行緒的自動管理 執行緒池

在多執行緒的程式中,經常會出現兩種情況 一種情況 應用程式中,執行緒把大部分的時間花費在等待狀態,等待某個事件發生,然後才能給予響應 這一般使用threadpool 執行緒池 來解決 另一種情況 執行緒平時都處於休眠狀態,只是周期性地被喚醒 這一般使用timer 定時器 來解決 threadpool...

C 多執行緒學習 四 多執行緒的自動管理 執行緒池

在多執行緒的程式中,經常會出現兩種情況 一種情況 應用程式中,執行緒把大部分的時間花費在等待狀態,等待某個事件發生,然後才能給予響應 這一般使用threadpool 執行緒池 來解決 另一種情況 執行緒平時都處於休眠狀態,只是周期性地被喚醒 這一般使用timer 定時器 來解決 threadpool...