我有一個紋理加載線程,它接收通過併發隊列從主線程加載紋理的請求。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
你能分享你的紋理工作線程的功能嗎? –