Взгляните на ваш второй фрагмент кода, "часть в основном":
boost::mutex::scoped_try_lock lock(mutex);
смущает меня здесь. try_lock
будет пытаться заблокировать мьютекс. Он не сможет заблокировать мьютекс и продолжить выполнение, если мьютекс используется в данный момент. Блок после мьютекса может быть защищен или не защищен мьютексом.
Это действительно то, что вы хотите сделать? Вы проверяли статус блокировки?
Или вы намеревались использовать
boost::mutex::scoped_lock lock(mutex);
Это блокирует выполнение потоков, пока не получит доступ к мьютексу. Блок после этого оператора всегда будет защищен мьютексом.
При try_lock
происходит следующее: если он не может заблокировать мьютекс, выполнение будет продолжено без блокировки. Вы несете ответственность за рассмотрение этого дела. Если вы этого не сделаете, мьютекс будет полностью неэффективным, и у вас будут условия гонки, небезопасный одновременный доступ и другие проблемы.
Это также может быть причиной того, что ваша программа ведет себя иначе в выпуске, чем в отладке. В выпуске определенные части программы работают намного быстрее, поэтому временные характеристики совершенно иные. Может случиться так, что в Debug время будет таким, что никогда не будет одновременного доступа к структуре данных, которую мьютекс должен защищать. Но в релизе все будет совсем по-другому.
Подводя итог: если вы специально не использовали scoped_try_lock
(который на самом деле является внутренним вспомогательным классом afaik), вы, вероятно, намеревались использовать scoped_lock
.