【发布时间】:2017-02-06 17:37:41
【问题描述】:
我有一个纹理加载线程,它通过并发队列从主线程接收加载纹理的请求。
纹理加载器请求是一个简单的结构,带有一个指向将接收纹理的对象的原始指针:
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;
}
纹理加载器一次可能会从主线程接收多个纹理加载请求,然后通过队列加载并将纹理分配给纹理加载请求消息中指向的内容查看器。
我遇到的问题是,当主线程“删除”内容查看器时,纹理加载线程的队列中可能有一个未完成的请求,当它开始处理它时,内容查看器已被删除然后程序崩溃了。
我不确定如何删除纹理线程工作队列中的未完成的纹理加载请求。我不能让主线程等待为内容查看器加载相关纹理,但是,实现这一点的最佳实践策略是什么?
谢谢 - 铺设
【问题讨论】:
-
使用 std::shared_ptr 会有帮助吗?
-
我已将您的问题重新提交给 opengl-es。 (opengl 标签表示 desktop-gl)。如果您的意思是 desktop-gl,请随意标记它并删除 opengl-es 标记。
-
你能分享你的纹理工作线程函数吗?
-
@xaxxon shared_ptr 在这里有什么用处?我猜纹理请求可能有一个weak_ptr,然后线程检查weak_ptr以确定有效性。我想我仍然需要围绕共享指针进行同步。对我来说,在这个用例中使用原始指针似乎更干净,但我不是使用共享指针的专家。
-
@farhat latrach 请见下文
标签: c++ multithreading opengl-es opengl-es-3.0