在多线程环境下,怎么样同时只允许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