none
求C# 线程队列 RRS feed

  • 问题

  • 线程队列

    比如说:有100个线程,将他们加入队列当中,同一时间只能运行3个线程,完成一个线程之后从队列中取出一个线程继续运行,直到线程全部运行完毕。

    2012年7月11日 8:23

答案

  • 实例化100个线程放入C队列中排队。A从C中取线程。A 为线程执行队列 始终保持3个,即同时运行。B 运行完成队列,在A中运行完成的线程放入B队列中。

    当运行完成后C队列为线程数为0,A也为0,B队列为100个已经完成的。

    2012年7月12日 1:17
  • 根据你的需求,完全没有必要事先创建100个线程。首先,创建每个线程都会有开销(Thread kernel object, Thread Environment Block, Kernel-mode Stack, User-Mode Statck)。其次,在线程完成后运行另一个线程可能会引起context switch(这点也是影响性能的)。我的建议是将你要给每个线程执行的方法包装为一个工作项,然后加入到一个thread safe的队列中,只需开启三个线程,这三个线程的工作就是从该队列中获取工作项,然后执行其中的方法,执行完了再去队列中去取,直到队列为空结束。这样始终就3个线程,而且也不会引起很多的context switch

    AndersTan

    2012年7月12日 2:01

全部回复

  • 实例化100个线程放入C队列中排队。A从C中取线程。A 为线程执行队列 始终保持3个,即同时运行。B 运行完成队列,在A中运行完成的线程放入B队列中。

    当运行完成后C队列为线程数为0,A也为0,B队列为100个已经完成的。

    2012年7月12日 1:17
  • 根据你的需求,完全没有必要事先创建100个线程。首先,创建每个线程都会有开销(Thread kernel object, Thread Environment Block, Kernel-mode Stack, User-Mode Statck)。其次,在线程完成后运行另一个线程可能会引起context switch(这点也是影响性能的)。我的建议是将你要给每个线程执行的方法包装为一个工作项,然后加入到一个thread safe的队列中,只需开启三个线程,这三个线程的工作就是从该队列中获取工作项,然后执行其中的方法,执行完了再去队列中去取,直到队列为空结束。这样始终就3个线程,而且也不会引起很多的context switch

    AndersTan

    2012年7月12日 2:01
  • 可以给一个demo吗?
    2012年7月12日 2:13