积极答复者
求C# 线程队列

问题
答案
-
实例化100个线程放入C队列中排队。A从C中取线程。A 为线程执行队列 始终保持3个,即同时运行。B 运行完成队列,在A中运行完成的线程放入B队列中。
当运行完成后C队列为线程数为0,A也为0,B队列为100个已经完成的。
- 已标记为答案 Bob ShenModerator 2012年8月7日 8:56
-
根据你的需求,完全没有必要事先创建100个线程。首先,创建每个线程都会有开销(Thread kernel object, Thread Environment Block, Kernel-mode Stack, User-Mode Statck)。其次,在线程完成后运行另一个线程可能会引起context switch(这点也是影响性能的)。我的建议是将你要给每个线程执行的方法包装为一个工作项,然后加入到一个thread safe的队列中,只需开启三个线程,这三个线程的工作就是从该队列中获取工作项,然后执行其中的方法,执行完了再去队列中去取,直到队列为空结束。这样始终就3个线程,而且也不会引起很多的context switch
AndersTan
- 已标记为答案 Bob ShenModerator 2012年8月7日 8:56
全部回复
-
实例化100个线程放入C队列中排队。A从C中取线程。A 为线程执行队列 始终保持3个,即同时运行。B 运行完成队列,在A中运行完成的线程放入B队列中。
当运行完成后C队列为线程数为0,A也为0,B队列为100个已经完成的。
- 已标记为答案 Bob ShenModerator 2012年8月7日 8:56
-
根据你的需求,完全没有必要事先创建100个线程。首先,创建每个线程都会有开销(Thread kernel object, Thread Environment Block, Kernel-mode Stack, User-Mode Statck)。其次,在线程完成后运行另一个线程可能会引起context switch(这点也是影响性能的)。我的建议是将你要给每个线程执行的方法包装为一个工作项,然后加入到一个thread safe的队列中,只需开启三个线程,这三个线程的工作就是从该队列中获取工作项,然后执行其中的方法,执行完了再去队列中去取,直到队列为空结束。这样始终就3个线程,而且也不会引起很多的context switch
AndersTan
- 已标记为答案 Bob ShenModerator 2012年8月7日 8:56