这是我面临的某种异常死锁吗?如何避免?
看看下面的行,我将连接的客户端的 TIdContext 对象存储在 objlist 中,有时我需要处理它。但是,如果一个用户在另一个线程正在处理列表时断开连接,那么对于该释放的 TIdContext->Data 对象,我将获得 Access 破坏,好吧,我正在使用 try/catch,但问题是在下面一行有某种死锁和进程挂起,如果我附加一个调试器,它会一次又一次地显示访问破坏,并且由于该异常死锁,CPU 消耗会增加。
AnsiString UserID = ((Tmyobject*) ((TIdContext*) ObjList->Objects[i])->Data)->UserID;
我知道我可以在访问对象之前进行检查,如果对象不为空,它就可以工作..但我的问题是,如果千载难逢地在执行 NULL 检查时和下一步时释放数据对象会怎样?当我再次访问该对象时,我会遇到同样的死锁???
那么如何避免/处理这个死锁异常呢?
这是调用堆栈...
:005F07C0 System::AnsiStringBase::AnsiStringBase(this=:0285FCE0, src=????)
:0040223F System::AnsiStringT<0>::AnsiStringT<0>(this=:0285FCE0, src=:00000008)
:00457996 TSomeClass::SomeFunction(this=:009D8230, UserID={ }, DataSize={ }, )
:0047BFF1 __linkproc__ ThreadProc(Thread=:009561C0)
:004AD00E __linkproc__ ThreadWrapper(Parameter=:009EAA30)
:7c80b729 ; C:\WINDOWS\system32\kernel32.dll
请帮忙pppppppppppppppppppp
谢谢
最佳答案
不要使用 try/catch 来处理访问冲突。这些不是 Java NullPointerExceptions,try/catch 无法处理它们造成的严重破坏。相反,修复潜在的错误。
一个deadlock是两个或多个线程永远卡住,等待彼此做某事。你拥有的是 race condition :一个线程正在更新对象列表,而另一个线程正在尝试使用它,如果第一个线程完成得太快,它可能会无意中破坏第二个线程。
处理竞争条件的标准方法是在使用竞争资源的所有代码周围放置某种锁,以便使用它的线程礼貌地轮流而不是相互竞争。阅读互斥体:它们是一个简单的同步原语,但可能足够强大来解决您的问题。
关于C++ Builder 2010 异常死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2485247/