gpt4 book ai didi

C++ Builder 2010 异常死锁?

转载 作者:搜寻专家 更新时间:2023-10-31 02:00:01 25 4
gpt4 key购买 nike

这是我面临的某种异常死锁吗?如何避免?

看看下面一行,我将已连接客户端的 TIdContext 对象存储在一个对象列表中,有时我需要处理它。但是如果一个用户在另一个线程正在处理列表时断开连接,那么对于那个释放的 TIdContext->Data 对象,我得到了 Access voilation,好的,我正在使用 try/catch 但问题是在下面一行有某种死锁和进程挂起,如果我附加调试器,它会一次又一次地显示 Access voilation,并且 cpu 消耗量会因为该异常死锁而上升。


AnsiString UserID = ((Tmyobject*) ((TIdContext*) ObjList->Objects[i])->Data)->UserID;

我知道我可以在访问对象之前检查,如果对象不是 Null,它就可以工作。但是我的问题是,如果在一个蓝色的月亮中,数据对象在执行 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

请帮忙pppppppppppppppppppppp

谢谢

最佳答案

不要使用 try/catch 来处理访问冲突。这些不是 Java NullPointerExceptions,try/catch 无法处理它们造成的破坏。而是修复底层错误。

A deadlock是指两个或多个线程永远卡住,等待彼此做某事。你拥有的是 race condition : 一个线程正在更新对象列表,而另一个线程正在尝试使用它,如果第一个线程完成得太快,它可能会无意中破坏第二个线程。

处理竞争条件的标准方法是在所有使用竞争资源的代码周围放置某种锁,这样使用它的线程就会礼貌地轮流使用,而不是相互竞争。阅读互斥量:它们是一个简单的同步原语,但可能足够强大以解决您的问题。

关于C++ Builder 2010 异常死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2485247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com