У меня есть поток загрузки текстур, который получает запросы на загрузку текстур из основного потока через параллельную очередь.
Запрос загрузчика текстуры представляет собой простую структуру с необработанным указателем на объект, который получит текстуру:
struct TextureLoaderRequest
{
std::string mFilename;
ContentViewer *mContentViewer;
};
Фактический объект текстуры, содержащийся в ContentViewer, защищен мьютексом и некоторыми атомарными логическими значениями (также содержащимися в ContentViewer):
std::atomic<bool> mIsLoaded;
std::atomic<bool> mIsVisible;
std::mutex mImageMutex;
Тогда процедуры доступа к текстуре выглядят следующим образом:
void ContentViewer::setTexture(ci::gl::TextureRef texture)
{
std::lock_guard<std::mutex> guard(mImageMutex);
mImage = texture;
}
ci::gl::TextureRef ContentViewer::getTexture()
{
std::lock_guard<std::mutex> guard(mImageMutex);
if (mIsVisible)
{
if (mImage != nullptr)
{
mIsLoaded = true;
return mImage;
}
mIsLoaded = false;
}
return nullptr;
}
Загрузчик текстур может получать множество запросов на загрузку текстур от основного потока за один раз, а затем работает через загрузку очереди и назначение текстур средству просмотра контента, указанному в сообщении с запросом на загрузку текстуры.
Проблема, с которой я сталкиваюсь, заключается в том, что когда основной поток «удаляет» средства просмотра содержимого, поток загрузки текстуры может иметь невыполненный запрос в своей очереди, и к тому времени, когда он доходит до его обработки, средство просмотра содержимого было удалено, а программа сбои.
Я не уверен, как удалить этот невыполненный запрос на загрузку текстуры, находящийся в очереди обработки потока текстуры. Я не могу позволить основному потоку ждать загрузки соответствующей текстуры для средства просмотра контента, но тогда какова наилучшая стратегия для достижения этой цели?
Спасибо - Лейте