关于c++在多线程中通过jsb调用js代码的问题

 我在c++中开启了一个多线程,然后在这个多线程中用ScriptingCore调用js代码。出现访问冲突的内存报错,仔细检查了一边,方法中并没有访问资源,只有一个简单的全局变量的访问。

  错误信息
  0x530C7E8A (mozjs-33.dll) (HQT.exe 中)处的第一机会异常:  0xC0000005:  读取位置 0x00000004 时发生访问冲突。
  0x530C7E8A (mozjs-33.dll) (HQT.exe 中)处有未经处理的异常:  0xC0000005:  读取位置 0x00000004 时发生访问冲突。

  c++中多线程中调用的代码
  ScriptingCore* scrCore = ScriptingCore::getInstance();
  JSContext* jc = scrCore->getGlobalContext();
  jsval owner = OBJECT_TO_JSVAL(scrCore->getGlobalObject());
  jsval codeid;
  codeid = uint32_to_jsval(jc, codeId);
  bool bCodeId = scrCore->executeFunctionWithOwner(owner, "CommonServerResponse", 1, &codeid);

js中的代码
var CommonServerResponse = function(codeid){
if (!codeid) {return;}
cc.log(“2222222222222222=”+codeid);
var info = g_ServerRequestInfo[codeid];
if (info) {
cc.log(“33333333333333333”+codeid);
DiyReceiveData(codeid);
var callback = info[“callback”];
var protocol = info[“protocol”];
var layer = info[“layer”];

	var Builder = g_ProtoBufBuilder.build(protocol);
	        var protoObj = Builder.decode(g_SerProBuf);
	callback(protoObj);
	layer.FadeOut();
	layer = null;
}

};

问题已经解决,具体原因,我有自己的猜测,不知道正确不正确。如果有哪位大神知道,请指正一下。
js是基于单线程的,cocos环境也是在主线程中运行,而js的调用基本都是在主线程中操作,极少会在多线程中处理。我这里的线程开启是用于网络数据返回用的,现在是想检测如果有数据返回,自动调用js的某个方法,之后执行请求回调。
原因就处在cc.log上了。一开始我在多个地方做cc.log的打印,结果每次出错的地方都不一样。之后换了个方式也可以解决。cc.director.getScheduler().performFunctionInCocosThread(function(){
CommonServerResponse(codeid);
});加了一层cocos中回到cocos的线程中调用的方法。这样就不会报错了。
以这个为启发我将所有的cc.log删除,之后也不会报错了。
所以,原因就很清楚了。
开始我一直以为是js是单线程支持,而没有原子性,lock处理,可能引起js内部的访问冲突。或者是cocos的转换方法ScriptingCore的访问冲突。
如果是访问冲突问题,那让他们不同时访问就行了,之后就找c++子线程回到主线程中调用的方法,结果找到了cocos的这个方法。
当然最后的原因还是主线程和子线程同时对cocos对象的访问,而没有做lock,或者原子处理。结果导致的访问冲突。