2011-02-18 7 views
1

lxの下で、wxCriticalSectionが再帰的ではないことを発見しました(スレッドが複数回セクションをつかむとデッドロックします)。ソースを見ると、wxCriticalSectionは、wxMUTEX_RECURSIVEを使わずに、LinuxではwxMutexを使って実装されていることがわかりました。私はWinとMacの下でうまく動作するコードベースを持っており、Linuxに移植したいのですが、再帰を避けていない場所ではデッドロックが発生します。Linux/UnixのwxCriticalSection

今、私は二つの可能性があります。

  1. 私の目的のためのwxWidgetsを変更し、再構築(brrr - 万が一、私は以来、私はその背後にある設計上の決定についてはあまり知らないことをavpidたい)

  2. 私の可能なコードパスのそれぞれとすべてのデバッグ

第三の方法があります(brrr - 起こしやすい - 日かかりますとは恐ろしくバグです) wxCriticalSectionをMac/Win/Unixでも同じように動作する構造体で置き換える/拡張するか?

ps。誰かが私にデザインの決定を説明できますか?氏ヴァディムZは

は私が一時的に(再帰的wxCriticalSectionsを作る)私はこれに反対した理由を忘れていましたが、私は(もちろん、私のメッセージを送った後)30秒後にそれを思い出しました...と言います。バージョン2.9.1では

しかし、フォローアップがなかった...

答えて

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でコンストラクタ宣言は、私がLinuxを使用していないので、私はコンパイル時にwxCriticalSectionが実際に再帰的であることを確認することはできません

wxCRITSECT_INLINE wxCriticalSection(wxCriticalSectionType critSecType = wxCRITSEC_DEFAULT); 

です。

+0

はい、申し訳ありませんが、バージョンについては言及していませんでした。私はwx 2.8.11、 "現在の安定したリリース"で働いています。 とにかく、これは私の解決策だと思います - 2.9が安定するのを待っています –

関連する問題