Unity多线程增加THREAD_SAFE宏定义仍然Crash
`========== OUTPUTTING STACK TRACE ==================
0x00007FFFB86B698A (xlua) lua_newthread 0x00007FFFB86B3B2B (xlua) lua_newthread 0x00007FFFB86B41A5 (xlua) lua_newthread 0x00007FFFB86A24D3 (xlua) lua_next 0x00007FFFB86B9AC6 (xlua) lua_newthread 0x00007FFFB86B9AA8 (xlua) lua_newthread 0x00007FFFB86BBC78 (xlua) luaL_where 0x00007FFFB86BBB45 (xlua) luaL_where 0x00007FFFB86BB8D3 (xlua) luaL_traceback 0x00007FFFB86BE42F (xlua) luaopen_coroutine 0x00007FFFB86A7C92 (xlua) lua_setlocal 0x00007FFFB86A7745 (xlua) lua_setlocal 0x00007FFFB86A77A5 (xlua) lua_setlocal 0x00007FFFB86A7F95 (xlua) lua_setlocal 0x00007FFFB86A79E0 (xlua) lua_setlocal 0x00007FFFB86A25F1 (xlua) lua_pcallk 0x00007FFFB86D1525 (xlua) lua_pcall 0x0000000055B05526 (Mono JIT Code) (wrapper managed-to-native) XLua.LuaDLL.Lua:lua_pcall (intptr,int,int,int) 0x0000000066B90D1B (Mono JIT Code) [E:\CellAtWorkClone\WorkCellClient\Assets\XLua\Src\StaticLuaCallbacks.cs:645] XLua.StaticLuaCallbacks:Print (intptr) 0x0000000055B01C0B (Mono JIT Code) (wrapper native-to-managed) XLua.StaticLuaCallbacks:Print (intptr) 0x00007FFFB86D10CC (xlua) cls_newindexer 0x00007FFFB86A7C92 (xlua) lua_setlocal 0x00007FFFB86B8437 (xlua) lua_newthread 0x00007FFFB86A7751 (xlua) lua_setlocal 0x00007FFFB86A77A5 (xlua) lua_setlocal 0x00007FFFB86A7F95 (xlua) lua_setlocal 0x00007FFFB86A79E0 (xlua) lua_setlocal 0x00007FFFB86A25F1 (xlua) lua_pcallk 0x00007FFFB86D1525 (xlua) lua_pcall 0x0000000055B05526 (Mono JIT Code) (wrapper managed-to-native) XLua.LuaDLL.Lua:lua_pcall (intptr,int,int,int) 0x0000000065F7BA53 (Mono JIT Code) XLuaGenDelegateImpl0:Gen_Delegate_Imp8 () 0x0000000066BA98D2 (Mono JIT Code) [E:\CellAtWorkClone\WorkCellClient\Assets\Scripts\Ping.cs:26] Ping:SendPing () 0x0000000066BA96DF (Mono JIT Code) System.Threading.ThreadHelper:ThreadStart_Context (object) 0x0000000066BA8B91 (Mono JIT Code) System.Threading.ExecutionContext:RunInternal (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) 0x0000000066BA850B (Mono JIT Code) System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) 0x0000000066BA8353 (Mono JIT Code) System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object) 0x0000000066BA807B (Mono JIT Code) System.Threading.ThreadHelper:ThreadStart () 0x0000000046474CD0 (Mono JIT Code) (wrapper runtime-invoke) object:runtime_invoke_void__this (object,intptr,intptr,intptr) 0x00007FFFAF16BE7B (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\mini\mini-runtime.c:2809] mono_jit_runtime_invoke 0x00007FFFAF0F1E32 (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\object.c:2919] do_runtime_invoke 0x00007FFFAF0FB012 (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\object.c:3071] mono_runtime_invoke_checked 0x00007FFFAF11549F (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\threads.c:1043] start_wrapper_internal 0x00007FFFAF1151E6 (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\threads.c:1093] start_wrapper 0x00007FFFFDBD7034 (KERNEL32) BaseThreadInitThunk 0x00007FFFFDEE2651 (ntdll) RtlUserThreadStart
========== END OF STACKTRACE ===========`
`public class Ping : TSingletonComponent<Ping> { private Action luaSendPing = null; private Thread t;
public void Init(Action luaSendPing)
{
this.luaSendPing = luaSendPing;
Log.d("ping", "开启线程");
t = new Thread(SendPing);
t.Start();
}
void SendPing()
{
while (true)
{
Thread.Sleep(5000);
luaSendPing();
}
}
private void OnDestroy()
{
StopPing();
}
public void StopPing()
{
if (t != null)
{
Log.d("ping", "关闭线程");
t.Abort();
t = null;
}
if (luaSendPing != null)
{
luaSendPing = null;
}
}
}`
是不是漏了lua的代码?
-- lua端接口传到了C#端 function Packet.CMDS2CLogin(bytes) print("CMDS2CLogin") local pbData = Packet.ParseMessage("S2CLogin", bytes) if pbData.isSuccess then App:GetModel("SystemModel"):ParseData(pbData) Packet.CMDC2SEnterGame(pbData.token) CS.Ping:GetInstance():Init(Packet.CMDC2SPing) end end
-- 在这里执行的,并且运行时能看到Ping的日志 function Packet.CMDC2SPing() CS.UnityEngine.Debug.Log("Ping") local sendData = {} sendData.code = App:GetModel("SystemModel").code + 1 Packet.SendPacket("CMDC2SPing", "C2SPing", sendData) end
-- lua端接口传到了C#端 function Packet.CMDS2CLogin(bytes) print("CMDS2CLogin") local pbData = Packet.ParseMessage("S2CLogin", bytes) if pbData.isSuccess then App:GetModel("SystemModel"):ParseData(pbData) Packet.CMDC2SEnterGame(pbData.token) CS.Ping:GetInstance():Init(Packet.CMDC2SPing) end end
-- 在这里执行的,并且运行时能看到Ping的日志 function Packet.CMDC2SPing() CS.UnityEngine.Debug.Log("Ping") local sendData = {} sendData.code = App:GetModel("SystemModel").code + 1 Packet.SendPacket("CMDC2SPing", "C2SPing", sendData) end
这啥?能否有简单的例子,你这一大堆代码,调用了一大堆东西,你怎么确认是不是被调用c# api没做线程安全呢?
一个简单例子:
1.在lua main文件中声明一个全局的方法ThreadMethod,方法内部进行日志打印,如下
function ThreadMethod() CS.UnityEngine.Debug.Log("ThreadMethod Call") end
2.C#端通过m_luaenv.Global.Get("ThreadMethod", out ThreadMethod); 获取该lua接口后,调用StartThread()开启线程
` System.Threading.Thread t;
private void StartThread()
{
t = new System.Threading.Thread(TreadCall);
t.Start();
}
private void TreadCall()
{
while (true)
{
ThreadMethod();
Debug.Log("TreadCall");
System.Threading.Thread.Sleep(1000);
}
}`
3.挂着不动等待5分钟左右会崩溃,两次崩溃日志不太相同,请大佬指教哪里出了问题[抱拳]
---------------------------------------第一个崩溃日志-------------------------------------------------
0x00007FFFC45587BB (xlua) lua_yieldk
0x00007FFFC4557B6B (xlua) lua_setlocal
0x00007FFFC4557745 (xlua) lua_setlocal
0x00007FFFC45577A5 (xlua) lua_setlocal
0x00007FFFC4557F95 (xlua) lua_setlocal
0x00007FFFC45579E0 (xlua) lua_setlocal
0x00007FFFC45525F1 (xlua) lua_pcallk
0x00007FFFC4581525 (xlua) lua_pcall
0x00000000505A80F6 (Mono JIT Code) (wrapper managed-to-native) XLua.LuaDLL.Lua:lua_pcall (intptr,int,int,int)
0x00000000770D82DB (Mono JIT Code) XLuaGenDelegateImpl0:Gen_Delegate_Imp12 (single)
0x00000000770D7E3A (Mono JIT Code) [E:\CellAtWorkClone\WorkCellClient\Assets\Scripts\LuaHelper\LuaLooper.cs:88] LuaLooper:FixedUpdate ()
0x000000005052E8A8 (Mono JIT Code) (wrapper runtime-invoke) object:runtime_invoke_void__this (object,intptr,intptr,intptr)
0x00007FFFB4CABE7B (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\mini\mini-runtime.c:2809] mono_jit_runtime_invoke
0x00007FFFB4C31E32 (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\object.c:2919] do_runtime_invoke
0x00007FFFB4C3AE3F (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\object.c:2966] mono_runtime_invoke
0x0000000140C006EA (Unity) scripting_method_invoke
0x0000000140BF0A3A (Unity) ScriptingInvocation::Invoke
0x0000000140BB9627 (Unity) MonoBehaviour::CallMethodIfAvailable
0x0000000140BB9D41 (Unity) MonoBehaviour::CallUpdateMethod
0x00000001406EC21C (Unity) BaseBehaviourManager::CommonUpdate<FixedBehaviourManager>
0x00000001406F28D6 (Unity) FixedBehaviourManager::Update
0x000000014095BD9C (Unity) InitPlayerLoopCallbacks'::2'::FixedUpdateScriptRunBehaviourFixedUpdateRegistrator::Forward
0x000000014095B397 (Unity) ExecutePlayerLoop
0x000000014095B463 (Unity) ExecutePlayerLoop
0x000000014095E721 (Unity) PlayerLoop
0x000000014133DE2F (Unity) PlayerLoopController::UpdateScene
0x000000014133C3E0 (Unity) Application::TickTimer
0x000000014149881B (Unity) MainMessageLoop
0x000000014149A4B6 (Unity) WinMain
0x00000001424864EA (Unity) __scrt_common_main_seh
0x00007FFFFDBD7034 (KERNEL32) BaseThreadInitThunk
0x00007FFFFDEE2651 (ntdll) RtlUserThreadStart)
---------------------------------------第二个崩溃日志-------------------------------------------------
0x00007FFFC45810DB (xlua) cls_newindexer
0x00007FFFC4557C92 (xlua) lua_setlocal
0x00007FFFC4568437 (xlua) lua_newthread
0x00007FFFC4557751 (xlua) lua_setlocal
0x00007FFFC45577A5 (xlua) lua_setlocal
0x00007FFFC4557F95 (xlua) lua_setlocal
0x00007FFFC45579E0 (xlua) lua_setlocal
0x00007FFFC45525F1 (xlua) lua_pcallk
0x00007FFFC4581525 (xlua) lua_pcall
0x000000005D4E80F6 (Mono JIT Code) (wrapper managed-to-native) XLua.LuaDLL.Lua:lua_pcall (intptr,int,int,int)
0x000000006F40B95B (Mono JIT Code) XLuaGenDelegateImpl0:Gen_Delegate_Imp12 (single)
0x000000006F40B4BA (Mono JIT Code) [E:\CellAtWorkClone\WorkCellClient\Assets\Scripts\LuaHelper\LuaLooper.cs:88] LuaLooper:FixedUpdate ()
0x0000000057D50168 (Mono JIT Code) (wrapper runtime-invoke) object:runtime_invoke_void__this (object,intptr,intptr,intptr)
0x00007FFFB4CABE7B (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\mini\mini-runtime.c:2809] mono_jit_runtime_invoke
0x00007FFFB4C31E32 (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\object.c:2919] do_runtime_invoke
0x00007FFFB4C3AE3F (mono-2.0-bdwgc) [c:\buildslave\mono\build\mono\metadata\object.c:2966] mono_runtime_invoke
TreadCall
UnityEngine.DebugLogHandler:Internal_Log(LogType, String, Object)
UnityEngine.DebugLogHandler:LogFormat(LogType, Object, String, Object[])
UnityEngine.Logger:Log(LogType, Object)
UnityEngine.Debug:Log(Object)
LuaScriptManager:TreadCall() (at Assets\Scripts\LuaHelper\LuaScriptManager.cs:100)
System.Threading.ThreadHelper:ThreadStart_Context(Object)
System.Threading.ExecutionContext:RunInternal(ExecutionContext, ContextCallback, Object, Boolean)
System.Threading.ExecutionContext:Run(ExecutionContext, ContextCallback, Object, Boolean)
System.Threading.ExecutionContext:Run(ExecutionContext, ContextCallback, Object)
System.Threading.ThreadHelper:ThreadStart()
(Filename: Assets/Scripts/LuaHelper/LuaScriptManager.cs Line: 100)
0x0000000140C006EA (Unity) scripting_method_invoke
0x0000000140BF0A3A (Unity) ScriptingInvocation::Invoke
0x0000000140BB9627 (Unity) MonoBehaviour::CallMethodIfAvailable
0x0000000140BB9D41 (Unity) MonoBehaviour::CallUpdateMethod
0x00000001406EC21C (Unity) BaseBehaviourManager::CommonUpdate<FixedBehaviourManager>
0x00000001406F28D6 (Unity) FixedBehaviourManager::Update
0x000000014095BD9C (Unity) InitPlayerLoopCallbacks'::2'::FixedUpdateScriptRunBehaviourFixedUpdateRegistrator::Forward
0x000000014095B397 (Unity) ExecutePlayerLoop
0x000000014095B463 (Unity) ExecutePlayerLoop
0x000000014095E721 (Unity) PlayerLoop
0x000000014133DE2F (Unity) PlayerLoopController::UpdateScene
0x000000014133C3E0 (Unity) Application::TickTimer
0x000000014149881B (Unity) MainMessageLoop
0x000000014149A4B6 (Unity) WinMain
0x00000001424864EA (Unity) __scrt_common_main_seh
0x00007FFFFDBD7034 (KERNEL32) BaseThreadInitThunk
0x00007FFFFDEE2651 (ntdll) RtlUserThreadStart
THREAD_SAFE已经确保lua同一时间只能被一个线程访问。 而且按你的测试场景,即使不加THREAD_SAFE也不会有问题,因为只有一个线程在访问。 所以怀疑UnityEngine.Debug.Log在非主线程调用的问题。Unity很多api其实都不支持在非主线程调用。
@UnityLearnerr 排查出来是log的问题还是 调用了其它untiy非线程安全api