C# 互斥机制

C# 互斥机制,c#,multithreading,mutex,C#,Multithreading,Mutex,对于这种任务,C#/.NET中最合适的互斥alg是什么 许多阅读 少量增量更改(在“前进”状态机中最多3个) 非常低的碰撞概率(碰撞概率重要吗?) 我在考虑SimpleLock或ReaderWriterLockSlim,但我不确定该选择哪一个,以及是否有更好的方法用于此任务 谢谢。我不太了解ReaderWriterLockSlim,但可以使用读写互斥锁 如果允许多个读取并行访问临界段。如果该假设为真,则取决于我们的用例。这种情况经常发生,但并不总是如此 如果满足这个假设,读写互斥体应该是一个

对于这种任务,C#/.NET中最合适的互斥alg是什么

  • 许多阅读
  • 少量增量更改(在“前进”状态机中最多3个)
  • 非常低的碰撞概率(碰撞概率重要吗?)
我在考虑SimpleLock或ReaderWriterLockSlim,但我不确定该选择哪一个,以及是否有更好的方法用于此任务


谢谢。

我不太了解ReaderWriterLockSlim,但可以使用读写互斥锁 如果允许多个读取并行访问临界段。如果该假设为真,则取决于我们的用例。这种情况经常发生,但并不总是如此

如果满足这个假设,读写互斥体应该是一个很好的选择


在这种情况下,你所说的“碰撞概率”是什么意思?两个线程同时尝试访问临界段的概率

您需要执行自己的基准测试。我想您会发现,在大多数情况下,普通的
ReaderWriterLockSlim
更快,即使大多数访问都符合只读条件。原因是维护锁的开销要高得多。我做基准测试已经有一段时间了,但我相信
readwriterlocksim
锁大约慢5倍。显然,长时间保持锁将减少开销的总体影响。在某种程度上,它不再是主导因素。里程数因情况而异,因此我在这里给出的最好建议是您自己进行基准测试。

尽管这是一个古老的思路(不管是什么帖子),但我发现了一种独特的锁与互斥的方法,在某些情况下是有益的

如果您希望访问多个实体的冲突不常见,请考虑以下方法:

  • 使用锁(互斥体)…无论什么)获取相关数据的副本
    • 确保至少有一个复制的项目足以进行比较 对照原件,以检测是否有变更 发生
    • 释放锁
  • 对副本执行操作,保持比较项稳定
  • 再次获取锁
  • 将参考项目与其原始项目进行比较,以确定是否发生了更改
  • 如果没有,请应用您的结果 如果是这样,请放弃您的结果,重新获取副本并重新开始
    • 释放锁
例如:

  • 锁定支票账户和储蓄账户;获取余额和最新交易时间的副本;解锁
  • 计算变化。。。例如,将5美元从储蓄转为支票
  • 再次锁定帐户;比较事务时间的实际副本与您的副本-如果它们匹配,应用计算值并解锁,如果不匹配,则重新获取、解锁并重新启动
  • 其思想是,如果有任何活动也需要锁定,但不会影响代码的结果(无可否认,对于这种情况,该示例不是一个好的示例),那么您就没有阻止其他代码的执行


    这方面存在一些硬件,但它不再是“主流”:IBM System 370针对这种情况提供了原子比较和更新指令。

    如果您想得到有用的答案,您需要提供有关数据结构等的更多信息。概率非常低,即使在非常长的时间内也不太可能,并且远低于((加速时间)/(运行时))^(踏板数)这是一款非常短且快速的algorhitm,在大多数情况下,我需要它来在很短的时间内改变状态枚举。然后我也会支持Brian的答案。即使是旋转锁也可能很适合。有C#旋转锁吗?或者甚至一个原始的比较和交换操作就足够了。@dmeister:是的,.NET BCL包含
    Interlocked.compareeexchange
    自旋锁
    类。