背景:
上篇博文介绍了dcm4chee中使用的Leader/Follower线程池模型,主要目的是节省上下文切换,提高运行效率。本博文同属【DICOM开源库多线程分析】系列,着重介绍fo-dicom中使用的ThreadPoolQueue线程池。
ThreadPoolQueue in fo-dicom:
先看一下ThreadPoolQueue代码中自定义的数据结构,
public class ThreadPoolQueue<T> {
private class WorkItem {
public T Group;
public Action Action;
public WaitCallback Callback;
public object State;
}
private class WorkGroup {
public T Key;
public object Lock = new object();
public volatile bool Executing = false;
public Queue<WorkItem> Items = new Queue<WorkItem>();
public WorkGroup(T key) {
Key = key;
}
}
private object _lock = new object();
private volatile bool _stopped = false;
private Dictionary<T, WorkGroup> _groups;
public ThreadPoolQueue() {
_groups = new Dictionary<T, WorkGroup>();
Linger = 200;
DefaultGroup = default(T);
}
……
}
由上述结构基本可以看出ThreadPoolQueue自定义线程池队列是将不同的线程根据类型T进行分组,并将对应的处理操作代理(Action与WaitCallback)一同传入。
相较于传统的ThreadPool系统线程池,ThreadPoolQueue通过创建字典对象Dictionary
private void Execute(T groupKey) {
if (_stopped)
return;
WorkGroup group = null;
lock (_lock) {
if (!_groups.TryGetValue(groupKey, out group))
return;
}
lock (group.Lock) {
if (group.Executing)
return;
if (group.Items.Count == 0 && !group.Key.Equals(DefaultGroup)) {
_groups.Remove(groupKey);
System.Console.WriteLine("Remove WorkGroup Key is {