知识卡片

三种同步原语,按等待双方和代价分层

专业/工作 · 116

内容

Vulkan没有用一种通用的同步原语覆盖所有场景,而是按”谁在等、代价多大”分成三种:栅栏是重量级的,专门给主机等设备用,通常借助操作系统原语实现,等待时线程可以真正休眠,适合”等一大批工作彻底做完”这种耗时较长的场景;事件是细粒度的,主机和设备都能设置/等待,还能精确到管线的某个阶段,用于同步同一条管线内部不同阶段之间的先后关系;信号量则专门服务于队列之间——它不能被主机或设备显式查询、设置或等待,只能作为队列提交操作的输入输出,用来把一个队列产出的数据和另一个队列消费这份数据的时刻串联起来(比如计算队列算完通知信号量,图形队列等这个信号量再开始)。这种”没有万能同步原语,而是按等待关系的形状(主机等设备/管线内部/跨队列)拆成专用工具”的思路,在设计任何并发系统的同步机制时都值得借鉴——用最匹配场景的工具,而不是所有地方都用最重的那把锁。

参考来源

《Vulkan 应用开发指南》第11章《同步》