共享对象和线程

Posted

技术标签:

【中文标题】共享对象和线程【英文标题】:Shared object and threads 【发布时间】:2012-12-13 08:50:25 【问题描述】:

我设计了一个类MemoryBlock。就像名字所说的那样,它是一块(非托管)内存。我只是简单地做var x = new MemoryBlock (1024, 16),它给了我 1kB 的内存(也对齐到 16 个字节)。所以现在一些线程想要使用不安全的上下文读/写这个块。我做了类似SyncRoot 属性来同步线程。所以我做lock (myMemoryBlock.SyncRoot) 并用内存做一些事情。不知道好不好,但我在收藏中看到了这样的东西。 这种简单的机制不允许多个线程访问该对象。写作可以,但阅读不够。我想要这样的东西:

1) 如果线程正在写入对象,则没有其他线程可以访问该对象 2) 如果线程正在读取对象,许多其他线程可以从该对象读取,但不能写入它 3) 如果使用了对象并且线程要写入,则线程等待直到对象空闲 4)专家模式:如果一些线程正在读取对象,而另一个线程想要写入它,它会等到对象空闲,但也会告诉对象停止,从而可以访问要从该对象(队列)读取的新线程。

我会很高兴得到简单的提示,不需要代码。

【问题讨论】:

你可能想看看这个问题***.com/questions/2116957/readerwriterlock-vs-lock 【参考方案1】:

看看 ReaderWriterLockSlim。基本上它有利于许多读者需要同时阅读但任何作家都应该阻止所有读者的情况。如果您的读/写比率为 50:50,则使用常规 lock(obj)

示例:ReadWriteLockSlim 适合缓存,即每秒有很多读者,但缓存每 5 分钟更新一次。

http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

【讨论】:

【参考方案2】:

您应该使用ReaderWriterLockSlim。

下面是这个类的常用用法:

public class SomeClass

    private MemoryBlock block = new MemoryBlock(1024, 16);

    private ReaderWriterLockSlim blockSyncObjcect = new ReaderWriterLockSlim();

    public void SomeRead()
    
        blockSyncObjcect.EnterReadLock();

        // Safe reading from the block

        blockSyncObjcect.ExitReadLock();
    

    public void SomeWrite()
    
        blockSyncObjcect.EnterWriteLock();

        // Safe writing to the block

        blockSyncObjcect.ExitWriteLock();
    

【讨论】:

以上是关于共享对象和线程的主要内容,如果未能解决你的问题,请参考以下文章

多线程访问共享对象和数据的方式

多个线程访问共享对象和数据的方式

共享对象和线程

了解具有线程和同步的共享对象

Java多线程与并发库7.多个线程之间共享数据的方式探讨

Java并发-对象共享