线程同步FIFO顺序



我找到了这个助手类:

public sealed class QueuedLock
{
    private object innerLock;
    private volatile int ticketsCount = 0;
    private volatile int ticketToRide = 1;
    public QueuedLock()
    {
        innerLock = new Object();
    }
    public void Enter()
    {
        int myTicket = Interlocked.Increment(ref ticketsCount);
        Monitor.Enter(innerLock);
        while (true)
        {
            if (myTicket == ticketToRide)
            {
                return;
            }
            else
            {
                Monitor.Wait(innerLock);
            }
        }
    }
    public void Exit()
    {
        Interlocked.Increment(ref ticketToRide);
        Monitor.PulseAll(innerLock);
        Monitor.Exit(innerLock);
    }
}

:

有一个同步类,保证先进先出顺序在c# ?

它对我来说很好,但我刚刚读了一些关于使用这些易失性变量的评论,我不确定这里是否有问题。我理解代码并在我的应用程序中实现它,以便完成正确的工作,但我承认,我看不到这种方法在未来的负面影响,至少,如果有的话。

我还没有看到很多这样做的方法,所以最好有一个完整和安全的版本,可以在任何情况下使用。

所以基本上,问题是,这种方法可以改进吗?有什么细微的问题吗?

对于多线程FIFO(队列),. net提供了ConcurrentQueue,我建议使用ConcurrentQueue而不是使用低级锁。

MSDN: ConcurrentQueue

您还可以为此目的查看TPL Dataflow BufferBlock类:

// Hand-off through a BufferBlock<T>
private static BufferBlock<int> m_buffer = new BufferBlock<int>();
// Producer
private static void Producer()
{
    while(true)
    {
        int item = Produce();
        // storing the messages in FIFO queue
        m_buffer.Post(item);
    }
}
// Consumer
private static async Task Consumer()
{
    while(true)
    {
        int item = await m_buffer.ReceiveAsync();
        Process(item);
    }
}
// Main
public static void Main()
{
    var p = Task.Factory.StartNew(Producer);
    var c = Consumer();
    Task.WaitAll(p,c);
}

最新更新