C# 例如,ableList,它的工作方式类似于列表,但支持的唯一操作是在末尾添加。当需要增加列表时,会创建一个新数组,将旧项复制到其中,列表的数组引用指向新数组,新项写入其中,并且项计数会增加。在add操作期间,AppendableList本身将始终处于一致状
C# 例如,ableList,它的工作方式类似于列表,但支持的唯一操作是在末尾添加。当需要增加列表时,会创建一个新数组,将旧项复制到其中,列表的数组引用指向新数组,新项写入其中,并且项计数会增加。在add操作期间,AppendableList本身将始终处于一致状,c#,exception-handling,synchronization,C#,Exception Handling,Synchronization,例如,ableList,它的工作方式类似于列表,但支持的唯一操作是在末尾添加。当需要增加列表时,会创建一个新数组,将旧项复制到其中,列表的数组引用指向新数组,新项写入其中,并且项计数会增加。在add操作期间,AppendableList本身将始终处于一致状态,但add不会是线程安全的。如果“添加”操作被挂起,并且允许第二个线程添加到列表中,则数据结构将正常……直到第一个线程尝试完成其操作为止。如果第一个线程部分完成了它的操作,但可以保证永远不会回来完成它,那么让数据结构对其他线程可用就没有问题了
例如,ableList,它的工作方式类似于列表,但支持的唯一操作是在末尾添加。当需要增加列表时,会创建一个新数组,将旧项复制到其中,列表的数组引用指向新数组,新项写入其中,并且项计数会增加。在add操作期间,AppendableList本身将始终处于一致状态,但add不会是线程安全的。如果“添加”操作被挂起,并且允许第二个线程添加到列表中,则数据结构将正常……直到第一个线程尝试完成其操作为止。如果第一个线程部分完成了它的操作,但可以保证永远不会回来完成它,那么让数据结构对其他线程可用就没有问题了。虽然我同意您的观点,即使数据处于无效状态的代码应该在释放锁之前清除数据,或者使用某种方法来表示数据处于无效状态,我认为假设锁中抛出的任何异常都会破坏状态是过于悲观的。@supercat:假设锁中抛出的任何异常都会使事物处于混乱状态不是过于悲观的。你拿了锁这一事实本身就意味着你希望锁能保护某些东西。如果失去这种保护不会破坏任何东西,那么你为什么要使用锁呢?@supercat:我当然同意你的观点,这可以概括为“扔掉读锁不会破坏任何东西”。当然但让我们看看这里的大局。然后,假定的场景正在读取由异常引起的关键部分保护的内容。这听起来是一个很好的处境吗?在这一关键部分中,单独阅读会导致异常,到底是怎么回事???这听起来像是一个需要修复的bug,而不是主线场景。
try
{
lock(syncblk)
{
// do some processing
}
}
catch(Exception e)
{
// do something with exception
}
System.Threading.Monitor.Enter(x);
try {
...
}
catch(Exception e)
{
}
finally {
System.Threading.Monitor.Exit(x);
}
lock(whatever)
{
try
{
MakeAMess();
}
finally
{
CleanItUp();
// Either by completing the operation or rolling it back
// to the pre-mess state
}
}