知识卡片

外部同步:把加锁的决定权还给应用层

专业/工作 · 110.b

内容

Vulkan假设多线程环境下可能有两个线程同时访问同一个对象,但绝大多数Vulkan命令本身不提供任何内部同步——这称为”外部同步”,即保证不发生冲突访问的责任完全在应用程序一侧。这样设计的目的是让Vulkan的实现永远不需要在内部用互斥量保护数据结构,多线程程序也就不会因为驱动内部加锁而产生跨线程的卡顿或阻塞。围绕这个前提,命令池、描述符池等资源池被设计成可以按线程各自持有一份:只要每个线程只从自己的池里分配对象,就完全不需要跨线程同步。这是一种”默认无锁、按需自己加锁”的取舍——把同步开销的决定权交给最了解自身并发模型的应用程序,而不是让驱动为所有可能的使用场景都预留保护,牺牲了易用性换取了确定的高性能。

参考来源

《Vulkan 应用开发指南》第1章《Vulkan概述》