我有一个纹理加载线程,它接收通过并发队列从主线程加载纹理的请求。C++多线程纹理加载器工作项从主线程中删除
纹理加载器请求是一个简单的结构与原料指向对象将接收质地:
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;
}
纹理加载器可能会从主线程一次接收到许多纹理加载请求,然后通过队列加载并将纹理分配给纹理加载请求消息中指向的内容查看器。
我遇到的问题是当主线程“删除”内容查看器时,纹理加载线程可能在其队列中有未完成的请求,并且在处理它时,内容查看器已经删除和程序崩溃。
我不知道如何去除纹理线程工作队列中的优秀纹理加载请求。我不能让主线程等待为内容查看器加载相关纹理,但是,那么实现此目的的最佳实践策略是什么?
感谢 - Laythe
会使用std :: shared_ptr会有帮助吗? – xaxxon
我已经对opengl-es的问题进行了修改。 (该opengl标签意味着桌面gl)。如果你的意思是desktop-gl,可以随意标记,并删除opengl-es标签。 – BDL
你能分享你的纹理工作线程的功能吗? –