【问题标题】:wxCriticalSection under Linux/UnixLinux/Unix 下的 wxCriticalSection
【发布时间】:2011-06-30 02:53:04
【问题描述】:

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

现在我有两种可能:

  1. 为我的目的更改和重建 wxWidgets(brrr - 我很想知道这一点,因为我不太了解其背后的设计决策)

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

是否有第三种方法,用在 Mac/Win/Unix 下表现相同的构造替换/扩展 wxCriticalSection?

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

我暂时忘记了我反对这个的原因(使 wxCriticalSections 递归),但 30 秒后我确实记得它(当然是在发送我的消息之后)。请看我的后续

但一直没有后续...

【问题讨论】:

    标签: linux wxwidgets


    【解决方案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 在编译时实际上是递归的。

    【讨论】:

    • 是的,抱歉我没有提到版本。我正在使用 wx 2.8.11,即“当前稳定版本”。无论如何,我认为这是我的解决方案 - 等待 2.9 稳定
    猜你喜欢
    • 1970-01-01
    • 2010-10-24
    • 2011-02-20
    • 2010-10-24
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多