【发布时间】:2014-05-01 20:07:14
【问题描述】:
我需要使用我自己的信号量类作为基础,在 C# 中编写我自己的 FIFO/强信号量。我找到了this example,但它不太正确,因为我不应该使用 Monitor.Enter/Exit。
这些是我的常规信号量的方法,我想知道是否有一种简单的方法可以将其调整为 FIFO。
public virtual void Acquire()
{
lock (this)
{
while (uintTokens == 0)
{
Monitor.Wait(this);
}
uintTokens--;
}
}
public virtual void Release(uint tokens = 1)
{
lock (this)
{
uintTokens += tokens;
Monitor.PulseAll(this);
}
}
【问题讨论】:
-
与您的问题不太相关,但您可能希望避免使用
lock(this)代码模式,因为它可能导致死锁。见stackoverflow.com/a/251668/1556108 -
您必须使用信号量吗?
ConcurrentQueue<T>怎么样 -
你的意思是使用 ConcurrentQueue 作为基础吗?老师希望我们自己制作所有实用程序,因此我们不使用任何内置的并发工具。不过,我有自己的 Channel 课程。感谢LB2的提示,老师没有问题,但无论如何我都会改变它。
-
查了
SemaphoreSlim.WaitAsync的源码,好像已经是FIFO了。为等待创建的每个任务都存储在一个以双链表实现的队列中。 -
FIFO
SemaphoreSlim的基本实现具有作为额外功能的public void Starve(int amount)方法,可以在here 找到。
标签: c# .net multithreading concurrency