SetWindowText 引起的死锁
在基于ltask多线程框架的游戏开发中,使用sokol_app封装窗口时遇到了启动阶段偶发黑屏的问题。经排查,死锁源于跨线程调用SetWindowTextW修改窗口标题。由于该API内部通过SendMessageW投递WM_SETTEXT消息,要求窗口线程处理完毕才能返回,而窗口线程当时正阻塞在另一个同步锁上,形成循环等待。 Windows消息机制要求通过SendMessageW发送涉及字符串生命周期管理的系统消息,因此不能简单改用PostWindowTextW避免阻塞。最终解决方案是在ltask框架内创建一个独立服务来执行SetWindowTextW,通过服务间异步消息传递修改标题指令,从而避免阻塞主帧处理流程。这一案例揭示了多线程环境下GUI消息循环与任务调度器交互时的典型死锁陷阱,关键在于理解Windows线程消息队列的同步特性,并设计解耦的线程通信机制。