Repository navigation
关于后台任务互斥锁的一些技术性设想 #6977
burningtnt
started this conversation in
日常闲聊 | General
Replies: 1 comment
|
使用VirtualThread需最低将JDK版本提升至21及以上,当前最低为17 #5734 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
TL;DL: 本文提出了一种 HMCL 后台任务的互斥锁技术性设计方案,具有编译期安全、防死锁的特点,并能渐进化迁移现有代码。
为什么我们需要后台任务互斥锁
现在,由于大部分任务执行都会弹出 Taskbar,用户不可能进行任何其他操作。如果未来我们允许用户操作其他界面,两个 Task 可能错误地同时修改同一资源,导致包括资源损坏在内的严重后果。例如,用户不能在安装整合包的同时调整其模组列表,两者都会修改模组文件夹下的文件。
部分资源如果可以通过封装层实现线程安全,则不再本技术性设想的讨论范畴之内。
模型
线程模型
设想下,HMCL 的架构应该如下:
简单而言,前端和后端都不应该与真实世界有任何交互:前端就像 Webview 沙盒一样,只能通过后端操作游戏;后端只能通过资源访问真实世界。
互斥锁模型
互斥锁之间存在父子关系,可保护一系列资源。
每一个后端任务只能在启动时获取特定互斥锁,运行时只能释放锁或降级到子锁,不能升级到父锁。
API 方案 1:类 Task 模型
考虑如下的
ByeResource和GreetingResource资源。考虑如下的
Routine任务好处:可以渐进化的迁移已有代码
坏处:用户可能错误地等待另一个非当前 TaskContext 发起的 Task,导致死锁。
API 方案 2:滥用 VirtualThread
考虑如下的
ByeResource和GreetingResource资源。考虑如下的
Routine任务好处:
去他妈的 CompletableFuture,我终于能离开锁进地狱了坏处:要打破封装用 VirtualThread 内部 API,实现开自己的 VT 线程池。
All reactions