遇到了一个我暂时无能为力的bug

发生一个暂时无法解决的bug,该bug是这样出现的(不是必现):
在连接进入游戏服务器成功时执行

// 这是运行run的代码,是开启一个新线程来运行一直循环跑run(直到游戏结束)
_subThreadInstance = new std::thread(CC_CALLBACK_0(CNetDelegate::run,this));
_subThreadInstance->detach();
is_need_quit = false;

void CNetDelegate::run()
{
while (!is_need_quit)
{
// …
onConnected(); // 运行到这里
}
is_need_quit = true;
}

void LuaGameNet::onConnected()
{
this->dispatchConnectedEvent(); // 运行到这里
}

void LuaGameNet::dispatchConnectedEvent()
{
int nHandler = ScriptHandlerMgr::getInstance()->getObjectHandler((void*)this, ScriptHandlerMgr::HandlerType::COCOSSOCKET_OPEN);
if (0 != nHandler) {
CommonScriptData data(nHandler, “”);
ScriptEvent event(kCommonEvent, (void*)&data);
ScriptEngineManager::getInstance()->getScriptEngine()->sendEvent(&event); // 运行到这里
}
}

int LuaEngine::sendEvent(ScriptEvent* evt)
{
// …
case kCommonEvent:
{
return handleCommonEvent(evt->data); // 运行到这里
}
break;
}

int LuaEngine::handleCommonEvent(void* data)
{
// …
int ret = _stack->executeFunctionByHandler(commonInfo->handler, commonInfo->eventSource ? 2 : 1); // 运行到这里
}
int LuaStack::executeFunctionByHandler(int nHandler, int numArgs)
{
// …
ret = executeFunction(numArgs); // 运行到这里, 此时 numArgs 为 1
}

剩下的栈堆为:
-2:TD.exe!cocos2d::luaStack::executeFunctionByHandler(int nHandler, int numArgs) 行 488 + 0x13字节 【也就是上一行】
-1:[下面的框架可能不正确和/或缺失,没有为lua51.dll加载符号]
0:lua51.dll!lua_yield() + 0xf187 字节【这是出错位置了,无法显示】

出现的异常叫:
TD.exe 中的 0x002821e7 (lua51.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0xffffffd0 时发生访问冲突
如有适用于此异常的处理程序,该程序便可安全地继续运行。

会不会有可能是lua那边的代码问题?

经过廖大的指点,这是由于子线程调用主线程导致luavm挂掉,导致游戏奔溃

出现这种奔溃:
-1:[下面的框架可能不正确和/或缺失,没有为lua51.dll加载符号]
0:lua51.dll!lua_yield() + 0xf187 字节【这是出错位置了,无法显示】

出现的异常叫:
TD.exe 中的 0x002821e7 (lua51.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0xffffffd0 时发生访问冲突
如有适用于此异常的处理程序,该程序便可安全地继续运行。

肯定是luavm挂掉的问题。

lua不是线程安全的,在不同的线程中访问同一个LUA虚拟机,很大的概率宕机。一般的解决方案是,用一个线程安全的容器收集要回调的事件,然后在主线程中再回调给lua。线程安全的容器可以用std::vector和锁就可以简单的实现,但是在push_back和遍历的时候要记得加锁。

您好,请问,最好怎么解决了吗