我有一段代码,它应该由低于N的线程的最大数量执行,并且线程调用someFunction()的顺序应该反映在它们进入该部分的顺序,即FIFO顺序。最多N个线程以FIFO的顺序执行的代码段
如果我使用Semaphore,我无法控制线程进入该部分的顺序。
“没有保证顺序,例如FIFO或LIFO,其中阻塞的 线程进入信号量。”
的初步尝试:
class someClass
{
static volatile Semaphore semaphore;
...
someClass()
{
semaphore = new Semaphore(N,N)
}
someType someFunction(InputType input)
{
try
{
semaphore.WaitOne();
/* Section Begins */
var response = someHeavyJob(input); // submitted to the server
return response;
/* Section Ends */
}
finally
{
semaphore.Release();
}
}
}
如果我结合了信号量和ConcurrentQueue如下线程可能会回来与由其他线程所带来的请求,你会需要的其他部分显著变化的响应码。 什么是采用以下问题的.NET 4.5溶液:
- 允许低于N中的代码
- 顺序在哪些线程进入区段的区段的最大线程数是FIFO
线程将获得他们所带来的请求的响应(而不是根据其他线程带来的请求)
class someClass { static volatile ConcurrentQueue<someType> cqueue; static volatile Semaphore semaphore; ... someClass() { cqueue = new ConcurrentQueue<someType>(); semaphore = new Semaphore(N,N) } someType someFunction(Request request) { try { cqueue.enqueue(request); semaphore.WaitOne(); Request newrequest; cqueue.TryDequeue(out newrequest); /* Section Begins */ var response = someHeavyJob(Request newrequest); // submitted to the server return response; /* Section Ends */ } finally { semaphore.Release(); } } }
更新: 我在澄清我的问题: SomeHeavyJobs()函数是对正在处理此工作的服务器的阻止调用。
UPDATE2: 谢谢大家的回答。备案:我结束了使用FIFO Semaphore
你能更具体吗?有点难以理解你的一些类和某种类型...你想在代码中修复什么 – Madman
我想要做的是将执行一段代码的线程数限制为N,其中N> 1并且仍然保持先进先出顺序 – matcheek
如果您正在讨论几个同时执行的线程,那么谈论“订单”有点难。你能详细说明一下吗?另外,你的队列和信号量应该是'readonly',而不是'volatile'。 – Groo