Я понимаю, что ваш выделенный поток отслеживания постоянно вызывает Tracker::update()
для получения данных локализации с вашего устройства (NDI Optotrak?)
Затем ваше приложение OpenGL получает доступ к последним точкам через регулярный интервал из основного потока, используя Tracker::getAllPoints()
.
В этом случае вектор трехмерных точек Tracker::points
является общим ресурсом между этими двумя потоками.
Чтобы предотвратить одновременный доступ, обе операции записи в update()
и чтения с getAllPoints()
должны быть защищены мьютексом, а не только записью, как в вашем текущем коде. Код чтения в основном потоке также должен блокировать мьютекс:
// In your main application:
void timerFunc()
{
Tracker* tracker = ...; // Obtain a pointer to the tracker object
tracker->LockResourceMutex(); // Enter critical section
vector< Eigen::Vector3d >& pointsRef = tracker->getAllPoints();
//... operations on points, protected by the mutex
tracker->UnlockResourceMutex(); // Leave critical section
}
// In class Tracker:
void Tracker::LockResourceMutex() { optotrakResourceMutex.lock(); }
void Tracker::UnlockResourceMutex() { optotrakResourceMutex.unlock(); }
Предупреждение: если ваши операции над точками в timerFunc()
являются медленными, то мьютекс будет оставаться заблокированным в течение длительного времени, и ваш поток трекера заблокирует его при вызове Tracker::update()
.
Лучшим вариантом было бы изменить Tracker::getAllPoints()
, чтобы он возвращал копию вектора трехмерных точек вместо ссылки:
// In class Tracker:
vector<Eigen::Vector3d> Tracker::getAllPoints()
{
boost::mutex::scoped_lock lock(optotrakResourceMutex);
return points; // Will call the std::vector() copy constructor
}
// In your main application:
void timerFunc()
{
Tracker* tracker = ...; // Obtain a pointer to the tracker object
vector< Eigen::Vector3d > myPoints = tracker->getAllPoints();
//... operations on your own copy if points
}
Обратите внимание, как мьютекс инкапсулирован в классе Tracker
и как timerFunc()
не нужно беспокоиться об этом.
Также обратите внимание, как мьютекс блокируется только во время копирования. Копия списка трехмерных векторов, безусловно, будет быстрее, чем математические операции с ними.