Я создаю приложение на основе PCL, для которого используется код граббера PCL по умолчанию для велодина, который можно увидеть здесь.
Когда я создаю свое приложение в режиме отладки, оно работает в соответствии с ожиданиями, но в сборке Release облака пропускаются, и я теряю одно или два облака. Я сузился до того факта, что есть некоторая проблема с мьютексом, с которой у меня нет опыта.
// Retrieved Point Cloud Callback Function
boost::mutex mutex;
boost::function<void(const pcl::PointCloud<PointType>::ConstPtr&)> function =[&cloud, &mutex](const pcl::PointCloud<PointType>::ConstPtr& ptr)
{
boost::mutex::scoped_lock lock(mutex);
// Point Cloud Processing
cloud = ptr;
};
это обратный вызов для получения моего облака, а нижняя часть - основная
while (!viewer->wasStopped())
{
viewer->spinOnce(); // Update Viewer
tStart = clock();
boost::mutex::scoped_try_lock lock(mutex);
Я не мог понять, почему есть разница в выпуске и отладке. Какие-либо предложения? Я использую Visual Studio 2017 и PCL 1.8.1.





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