wxCriticalSection под Linux / Unix - PullRequest
       5

wxCriticalSection под Linux / Unix

1 голос
/ 19 февраля 2011

Я обнаружил, что wxCriticalSection не является рекурсивным (блокируется, когда поток захватывает раздел более одного раза) в Linux.Глядя на источники, я обнаружил, что wxCriticalSection реализован с использованием wxMutex под Linux, но без использования wxMUTEX_RECURSIVE.У меня есть кодовая база, которая хорошо работает под Win и Mac, и я хочу портировать ее на Linux, но у меня есть тупики в некоторых местах, где я не избежал рекурсии.

Теперь у меня есть две возможности:

  1. Изменение и перестройка wxWidgets для моей цели (бррр - по любому случаю я хочу сказать, что так как я не слишком много знаю о проектных решениях, стоящих за этим)

  2. отладка каждого из моих возможных путей кода (brrr - займет несколько дней и ужасно подвержена ошибкам) ​​

Есть ли третий способ, заменяющий / расширяющий wxCriticalSection с помощью конструкциичто ведет себя одинаково под Mac / Win / Unix?

пс.Может ли кто-нибудь объяснить мне дизайнерское решение?Г-н Вадим З говорит ...

Я временно забыл причину, по которой я был против (делая рекурсивный wxCriticalSections), но я вспомнил об этом 30 секунд спустя (после отправки своего сообщения, конечно).Пожалуйста, посмотрите мое продолжение

Но продолжения не было ...

1 Ответ

1 голос
/ 24 февраля 2011

В версии 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 действительно рекурсивен при компиляции.

...