在多线程环境下,怎么样同时只允许N个线程访问?为描述方便,以下以只允许一个线程示例。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace test1 { class Program { static Semaphore semaphore = new Semaphore(1, 1); //同时只允许一线程 static void Main(string[] args) { for (int i = 0; i < 10; i++) { new Thread(new ParameterizedThreadStart(Work)).Start(i); } Console.Read(); } private static void Work(object i) { semaphore.WaitOne(); Console.WriteLine("本人是线程:{0}", (int)i); Thread.Sleep(100); //避免线程瞬间执行完成 semaphore.Release(); } } }
以上代码,执行结果并不会按照1,2,3……10 的顺序执行,也就是当需要等待的时候,进入的线程并不会排队。怎么样实现排队呢?
使用ThreadPool类会顺序执行,但不能创建多个线程池,而且最小线程数不能小于cpu核数,不是很好用。
问一下大家还有没有其他好的实现方法,谢谢。
解决方案
20
你让线程排队做啥,那还不如用同步方式,
线程是无序的,只能是取数据时排队,而不是让线程执行的方式排队
你想让他排,那只能用
for (int i = 0; i < 10; i++) { Thread t= new Thread(new ParameterizedThreadStart(Work)); t.Start(i); t.Join(); }
80
消息互斥Mutex
http://msdn.microsoft.com/zh-cn/library/system.threading.mutex.aspx
或直接用Task类的Wait方法以及等待当前线程结束。
http://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task.aspx
http://msdn.microsoft.com/zh-cn/library/system.threading.mutex.aspx
或直接用Task类的Wait方法以及等待当前线程结束。
http://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task.aspx