我发现wxCriticalSection不是递归的(当一个线程不止一次抓取一个部分时会死锁)。查看源代码,我发现在Linux下使用wxMutex实现了wxCriticalSection,但没有使用wxMUTEX_RECURSIVE。我有一个在Win和Mac下运行良好的代码库,我想将它移植到Linux,但我在一些我没有避免递归的地方遇到了死锁。
现在我有两种可能性:
为了我的目的而改变和重建wxWidgets(brrr - 我想要任何机会,因为我不太了解背后的设计决定)
调试我可能的每一个代码路径(brrr - 需要几天时间,而且很容易出错)
还有第三种方法,用在Mac / Win / Unix下同等行为的构造替换/扩展wxCriticalSection吗?
PS。有人可以向我解释设计决定吗? Vadim Z先生说......
我暂时忘记了我反对这一点的原因(使wxCriticalSections递归)但我确实在30秒后回忆起它(当然是在发送我的信息之后)。请参阅我的后续行动
但是从来没有跟进......
答案 0 :(得分:1)
在版本2.9.1中,默认情况下应该是递归的。在档案\wxWidgets-2.9.1\include\wx\thread.h
中:
inline wxCriticalSection::wxCriticalSection( wxCriticalSectionType critSecType )
: m_mutex( critSecType == wxCRITSEC_DEFAULT ? wxMUTEX_RECURSIVE : wxMUTEX_DEFAULT ) { }
在class wxCriticalSection
中,构造函数声明是
wxCRITSECT_INLINE wxCriticalSection( wxCriticalSectionType critSecType = wxCRITSEC_DEFAULT );
我不使用Linux,因此在编译时我无法验证wxCriticalSection
是否实际递归。