gpt4 book ai didi

从主线程中删除 C++ 多线程纹理加载器工作项

转载 作者:太空宇宙 更新时间:2023-11-04 13:06:30 24 4
gpt4 key购买 nike

我有一个纹理加载线程,它通过并发队列从主线程接收加载纹理的请求。

纹理加载器请求是一个简单的结构,带有指向将接收纹理的对象的原始指针:

struct TextureLoaderRequest
{
std::string mFilename;
ContentViewer *mContentViewer;
};

ContentViewer 中包含的实际纹理对象受互斥锁和一些原子 bool 值(也包含在 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;
}

纹理加载器可能会在同一时间从主线程接收到许多纹理加载请求,然后通过队列加载纹理并将纹理分配给纹理加载请求消息中指向的内容查看器。

我遇到的问题是,当主线程“删除”内容查看器时,纹理加载线程的队列中可能有一个未完成的请求,当它开始处理它时,内容查看器已被删除然后程序崩溃了。

我不确定如何删除纹理线程工作队列中未完成的纹理加载请求。我不能让主线程等待为内容查看器加载相关纹理,但是实现这一目标的最佳实践策略是什么?

谢谢- 莱特

最佳答案

好的,恕我直言,有两种选择:

  1. 您等待对特定对象的所有请求完成,然后再删除它。
  2. 在执行任何计划的操作之前检查对象是否仍然存在。

我对您的应用程序没有足够的了解:队列是如何实现的,为什么以及何时安排请求,所以我无法就此提供反馈。

关于从主线程中删除 C++ 多线程纹理加载器工作项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42052313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com