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