TextureCache::loadImage有一处多线程不安全的bug

auto it = _textures.find(asyncStruct->filename);就是这一行,使用多线程加载纹理时,偶尔崩溃到这一行,搜了网络和最新代码,都没有发现有人提及,但是看这行代码,应该存在多线程问题,unorder_map不是线程安全的,这样可能导致崩溃。
有人说用const_iterator是线程安全的,还没有尝试过,有人遇到过或者有解决办法吗?

没遇到崩溃 但是偶尔遇到异步加载卡住,始终加载不到资源

被卡住了有可能是那个资源被其他程序占用了,不然其他地方应该不会卡住的。

只能修改源码了啊,已经解决了,由于我的资源全是异步加载的,所以可以忽略同步加载的情况,只需要在TextureCache类中定义一个成员变量:std::mutex _textureMutex;
然后在TextureCache::loadImage函数用到textures的地方用这个锁锁住,TextureCache::addImageAsyncCallBack函数中对textures进行写操作的地方用这个锁锁住就可以啦。

还真没遇到这个问题,因为我的资源加载模块里纹理加载是一个个加载的,大概正好规避了这个问题吧。。

大神能不能贴代码出来啊,最近我也遇到了,急急急

后面想了想,最好不要同时加载,这样可能会造成瞬时内存爆发,一个一个的加载最好,加载完后隔一帧再加载更好,这样上一个纹理加载时用的内存就已经被释放了,而且这个也没有线程安全问题了。如果真的一定要这样做,就按我上面说的做就可以了。

每一帧一帧的加载

var LoadRes = {
_success: null,
_progress: null,

_total: null,
_curr: null,
_imgArry: null,
_bIsLoad: null,    

loadResource: function (params) {
    this._success = params.success;
    this._progress = params.progress;
    this._imgArry = params.resource;
    
    this._total = this._imgArry.length;
    this._curr = 0;
    
    this._bIsLoad = false;
    mm.schedule(this, this._update, 0, cc.REPEAT_FOREVER);
},

_loadingCallBack: function() {
    ++this._curr;
    if (this._curr >= this._total) {
        mm.unSchedule(this, this._update);
        this._success();
        return;
    }

    this._bIsLoad = false;
},

_update: function () {
    if (this._bIsLoad == false) {
        this._bIsLoad = true;
        cc.log("load img: "+this._imgArry+ "  curr: "+this._curr+ "  total: "+ this._total);
        
        var percentage = Math.floor(this._curr/this._total*100);
        this._progress(percentage);
        cc.textureCache.addImageAsync(this._imgArry, this._loadingCallBack, this);
    }
}

}