Linux / Unix下的wxCriticalSection

时间:2011-02-18 21:16:59

标签: linux wxwidgets

我发现wxCriticalSection不是递归的(当一个线程不止一次抓取一个部分时会死锁)。查看源代码,我发现在Linux下使用wxMutex实现了wxCriticalSection,但没有使用wxMUTEX_RECURSIVE。我有一个在Win和Mac下运行良好的代码库,我想将它移植到Linux,但我在一些我没有避免递归的地方遇到了死锁。

现在我有两种可能性:

  1. 为了我的目的而改变和重建wxWidgets(brrr - 我想要任何机会,因为我不太了解背后的设计决定)

  2. 调试我可能的每一个代码路径(brrr - 需要几天时间,而且很容易出错)

  3. 还有第三种方法,用在Mac / Win / Unix下同等行为的构造替换/扩展wxCriticalSection吗?

    PS。有人可以向我解释设计决定吗? Vadim Z先生说......

      

    我暂时忘记了我反对这一点的原因(使wxCriticalSections递归)但我确实在30秒后回忆起它(当然是在发送我的信息之后)。请参阅我的后续行动

    但是从来没有跟进......

1 个答案:

答案 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是否实际递归。