1

我在 .net 2.0 中有应用程序,其中我的应用程序中有一个全局的 DataTable 对象,并且在整个应用程序中有不同的数据视图。

当执行一个动作时,我创建了许多线程,比如说 5 个线程,其中数据是从不同的数据视图读取的,同时 2/3 线程正在读取数据(不是所有 2 个线程要读取数据),一个线程在数据表中写入数据。所以我们得到像“枚举更新”或“参数不为空”类型的异常。

我为此使用了 ReadWriteLock,但没有发现它在 ReaderWriterLock.AcquireWriterLock() 上停止的任何运气。

我不明白我在哪里做错了。

如果有人有任何想法。请帮助我如何为数据表和数据视图实现此场景的 ReaderWriterLock。

谢谢!!

4

1 回答 1

0

首先,这篇 MSDN 文章可能会有所帮助。Jeffrey Richter 谈到的库可在此处获得。

由于该应用程序是在 .Net 2.0 中开发的,因此我建议使用自定义的 ReaderWriterLock,它更喜欢作者而不是读者。此外,如果您正在寻找一些源代码,那么这个人可能会对您有所帮助。其中一个自定义的 ReaderWriterLock,他写道:

public sealed class ReaderWriterLock
{
    int readers = 0;
    int writers = 0;

    public void AcquireReaderLock()
    {
        Thread.BeginCriticalRegion();

        while (true)
        {
            if (Thread.VolatileRead(ref writers) == 0)
            {
                Interlocked.Increment(ref readers);

                if (Thread.VolatileRead(ref writers) == 0)
                {
                    return;
                }
                else
                {
                    Interlocked.Decrement(ref readers);
                }
            }

            Thread.Sleep(1);
        }
    }
    public void ReleaseReaderLock()
    {
        Interlocked.Decrement(ref readers);

        Thread.EndCriticalRegion();
    }
    public void AcquireWriterLock()
    {
        Thread.BeginCriticalRegion();

        while (Interlocked.CompareExchange(ref writers, 1, 0) != 0)
        {
            Thread.Sleep(1);
        }
        while (Thread.VolatileRead(ref readers) != 0)
        {
            Thread.Sleep(1);
        }
    }
    public void ReleaseWriterLock()
    {
        Thread.VolatileWrite(ref writers, 0);

        Thread.EndCriticalRegion();
    }
}

关键点:

  1. 喜欢作家胜过读者
  2. 先到先得
  3. 自旋锁非常适合短锁持续时间
于 2010-05-05T18:43:15.100 回答