Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中不使用锁的多个并发读卡器_C#_.net_Multithreading - Fatal编程技术网

C# C中不使用锁的多个并发读卡器

C# C中不使用锁的多个并发读卡器,c#,.net,multithreading,C#,.net,Multithreading,我在下面创建了一个示例程序。在这个程序中,我希望有两件事没有锁 我必须重写ToString方法,这个方法应该支持并发读卡器。 它应该是线程安全的 希望有一些好的答案。有各种集合类可以处理并发访问,例如在命名空间中 但它们都与锁一起工作。还有什么其他方法可以处理并发访问?将满足您的需要 使用ReaderWriterLockSlim保护由 多个线程,一次由一个线程写入。 ReaderWriterLockSlim允许多个线程处于读取模式, 允许一个线程处于写模式,并独占 锁定,并允许一个具有读取权限

我在下面创建了一个示例程序。在这个程序中,我希望有两件事没有锁

我必须重写ToString方法,这个方法应该支持并发读卡器。 它应该是线程安全的


希望有一些好的答案。

有各种集合类可以处理并发访问,例如在命名空间中


但它们都与锁一起工作。还有什么其他方法可以处理并发访问?

将满足您的需要

使用ReaderWriterLockSlim保护由 多个线程,一次由一个线程写入。 ReaderWriterLockSlim允许多个线程处于读取模式, 允许一个线程处于写模式,并独占 锁定,并允许一个具有读取权限的线程处于可升级状态 读取模式,线程可以从该模式升级到写入模式,而无需 必须放弃对资源的读访问权限


我相当肯定ReaderWriterLockSlim试图避免操作系统级互斥锁,通过旋转短锁和升级到互斥锁以获得更长的锁来使用这些互斥锁。

通过缓存折叠的字符串,可以优化单个编写器和多个并发读卡器的性能。并发读卡器可能会得到一个过时的字符串,但赋值将是原子的。但是,如果有多个编写器,则需要同步

public  class SecondClass
{
    private readonly List<string> _collection = new List<string>();
    private string _lastFoldedString;
    private const string delimiter = ",";

    public virtual void AddString(string text)
    {
        // You'll need some synchronization type if more than one concurrent writer
        // lock(_collection)
        {
           _collection.Add(text);
           // Or Use String.Join, or just have a running appender
           _lastFoldedString = _collection.Aggregate((i, j) => i + delimiter + j);
        }
    }

    public override string ToString()
    {
        return _lastFoldedString;
    }
}

为了得到好的答案,你需要有一个好的问题。这是毫无疑问的!SampleClass的目的是什么?它只是覆盖但调用SecondClass?为什么没有锁?这一要求背后有很多误解。只需使用常规锁或ReaderWriter版本。实现已经是线程安全的,并且支持多个读卡器,前提是您不打算在读卡器读取时添加任何内容。或好我现在不确定,因为迭代,但您可以更改为for->profit。只要没有并发写入程序,您可以支持系统所能容纳的尽可能多的读卡器。还有什么其他方法可以处理并发访问?嗯,锁不是魔法。它们也需要实施。看一看。那就永远不要用它-嗯?联锁也固有地使用锁。我不理解你的评论…好吧,定义锁。C lock语句是调用Monitor类的语法糖,它使用联锁类公开的相同处理器指令发挥其魔力。因此,在某种程度上,锁使用联锁操作,而不是相反的方式。关于更多信息,这是一本好书。现在我明白你的意思了。无论如何,底线是,所有变体归结为非常相同的机制。
public  class SecondClass
{
    private readonly List<string> _collection = new List<string>();
    private string _lastFoldedString;
    private const string delimiter = ",";

    public virtual void AddString(string text)
    {
        // You'll need some synchronization type if more than one concurrent writer
        // lock(_collection)
        {
           _collection.Add(text);
           // Or Use String.Join, or just have a running appender
           _lastFoldedString = _collection.Aggregate((i, j) => i + delimiter + j);
        }
    }

    public override string ToString()
    {
        return _lastFoldedString;
    }
}