如何编写以实体ID为条件的C#互斥块?

问题描述 投票:1回答:2

我正在寻找用于编码同步化操作的C#模式,包括对特定实体的两个不同数据库的写操作,这样我就可以避免在同一实体上同时进行操作的竞争条件。

例如线程1和线程2正在同时处理实体X上的操作。该操作将X的信息写入数据库A和数据库B。线程3正在对实体Y处理相同的操作。所需的行为是:

  • 线程1在处理对实体X的A和B的写操作时阻塞了线程2。
  • 线程2等待直到线程1完成对A和B的写入,然后对实体X进行对A和B的写入。
  • 线程3未被阻塞,并且在线程1正在处理时,处理向实体Y的A和B写入操作

我想避免的行为是:

  • 线程1向实体X写入A。
  • 线程2向实体X写入A。
  • 线程2向实体X写入B。
  • 线程1写入实体X的B。

我可以在所有线程上使用互斥量,但我真的不想阻止其他实体的操作。

c# synchronization mutex
2个回答
1
投票

我建议使用简单锁(如果它在代码的一个区域中),因为它将处理不同的对象(即.net对象),但是具有相同的值(因为它是相同的实体),所以我宁愿使用实体的某种形式的代码。如果实体具有某种形式的代码,则可以使用它-例如:


0
投票

避免通过多个线程同时处理同一对象的“标准”方法将与特定对象上的lock statement配合使用。锁定是在对象本身上获取的,因此当lock(X)lock(Y)!ReferenceEquals(X,Y)是独立的。

© www.soinside.com 2019 - 2024. All rights reserved.