IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:threading

共 4 篇相关文章

IT 累计浏览 2,027

让 lua 运行时动态切换操作系统线程

这篇讲的是开发者在构建跨平台游戏引擎时,如何巧妙解决一个操作系统级的线程调度矛盾。作者从 iOS 的一个严苛限制出发:系统要求窗口消息循环必须运行在主线程,否则程序可能被杀;而引擎为了隔离耗时的业务逻辑,又必须把窗口管理模块与用户主逻辑分到不同线程。 矛盾在于,用户的业务代码期望运行在 Lua 解释器启动时的主虚拟机(VM)中,窗口模块期望在独立线程,同时窗口模块还必须占据操作系统意义上的“主线程”。作者最初认为这无解,除非像 Skynet 那样深度定制 Lua 运行时,让 VM 能自由迁移。 真正的转机来自一个巧妙的 API 设计:`thread.fork`。它通常让 func1 在当前 VM,func2 在新建 VM 和线程上并行。但作者反其道而行,让 func1(用户主逻辑)在**新线程**上运行,而让 func2(窗口模块的新 VM)继续留在**当前线程**(即操作系统主线程)上执行。由于两者都通过 `pcall` 被限制在各自作用域内,用户代码完全感知不到自身线程已切换,而窗口模块则恰好满足了系统对主线程的要求。 这个方案的巧妙之处在于,没有去硬撼操作系统的规则,而是通过“偷梁换柱”——交换两个执行流所在线程的位置,让看似不可调和的约束在架构层得到了圆满解决。

IT 累计浏览 3,489

稳定性思考-强弱依赖2

这篇文章从一个实际问题切入:在微服务架构中,如何为弱依赖(如Cache)设置合理的“并发请求数阈值”?作者的分析思路很清晰,核心目标是实现高QPS下的资源消耗最小化,即“高QPS,少线程”。 作者通过一个Cache访问案例,结合公式 QPS=1000/RT * threadNum,做了生动的故障推演。正常时1个线程就能支撑400QPS;一旦Cache故障、RT飙升至3000ms,理论上就需要1200个线程,这会导致调用方线程池耗尽、频繁FullGC,陷入恶性循环。 为此,文章提出的核心方案是:限制访问弱依赖的线程数。例如,将阈值设为10。这样在上述故障中,调用方只会阻塞10个线程,整体服务保持正常,实现优雅降级。结合超时设置,能形成更有效的流控策略。 那么阈值设多少?文章给出了计算方法:根据可接受的RT(如100ms)和目标QPS(400)反推,得到 threadNum = 400 * 100 / 1000 = 40。作者也分享了经验数据:平均50ms的APP,阈值一般不超过60。文章最后点明,响应时间变长往往源于排队,而系统的最高QPS由瓶颈资源决定,盲目增加线程未必有用。

IT 累计浏览 3,685

Perl 的线程中的共享

这篇讲的是 Perl 多线程编程中一个非常实用且核心的特性——变量共享。作者从进程与线程的根本区别切入,清晰地指出线程因为不额外创建独立的地址空间和控制块,所以内存占用更轻巧,但它能直接共享主进程的内存环境。 文章重点剖析了在线程中如何安全有效地使用共享变量。作者没有停留在概念层面,而是直接展示了 Perl 中使用 `threads::shared` 模块实现变量共享的具体方法,并解释了其背后的原理。这就像为并发操作提供了一个公共的“白板”,让不同线程能直接读写同一份数据。 当然,共享也意味着需要谨慎。文章也指出了由此可能引入的竞争条件问题,并隐含地说明了为什么在修改共享变量时需要配合锁机制。对于想在 Perl 中利用多线程提升程序性能,特别是进行任务分发或数据聚合的开发者来说,这篇文章提供了理解共享模型和潜在风险的扎实起点。

IT 累计浏览 3,120

Posix线程互斥编程

这篇讲的是多线程编程中确保数据安全的核心基石——互斥锁。文章从线程并行执行时必然面临的数据竞争问题出发,清晰地阐述了如何使用 POSIX 互斥锁来保护临界区代码。 作者详细解释了互斥锁的基本操作:通过加锁和解锁来确保同一时刻只有一个线程能执行关键代码段,从而避免因并发修改而导致的逻辑错误或程序崩溃。文中可能涵盖了互斥锁的初始化、销毁、阻塞等待以及尝试加锁等核心接口的使用场景与注意事项。 正确理解和使用互斥锁,是编写可靠、高效多线程程序的关键一步。它不仅直接关系到程序的正确性,其锁粒度和竞争策略也深刻影响着多线程应用的整体性能。