Conan中的读锁由哪些操作触发?锁的生成逻辑是什么?
Conan 锁机制相关说明
触发读锁创建的操作
所有需要读取本地缓存包内容、且不需要修改包的操作,都会触发读锁,常见场景包括:
conan search/conan list:查询本地缓存内的包信息、包版本列表时conan info:拉取包的依赖关系、编译配置、哈希值等元数据时conan install依赖校验阶段:执行安装操作时,会先读取本地已存在的依赖包元数据校验版本、配置是否匹配,该阶段会对对应依赖包加读锁,仅当需要下载/编译新包时才会升级为写锁conan build依赖读取阶段:本地项目编译过程中,读取依赖包的头文件、静态库/动态库等资源时,会对依赖包加读锁conan export-pkg/conan create依赖校验阶段:导出包或者执行全流程创建包时,需要读取依赖包的元数据做兼容性校验,该阶段会加读锁
锁的生成与遗留逻辑
Conan 1.x及2.x版本默认采用基于文件的粒度锁,锁文件默认存储在本地缓存对应包的专属目录下,锁文件命名通常为conan.lock或带进程ID的临时锁文件:
锁的底层互斥逻辑为:读锁为共享锁,支持多个进程同时持有读锁读取包内容;写锁为排他锁,同一时间仅允许一个进程持有写锁修改包内容,读锁与写锁完全互斥。
正常运行的Conan进程会在对应操作执行完成后,主动释放并删除持有的锁文件;如果进程被强制中断(例如SIGKILL信号终止、进程崩溃、系统强制关机),锁文件的清理逻辑不会被执行,就会产生遗留锁文件。
如果遇到包被锁定的报错,且确认当前没有正在运行的Conan进程,可以手动删除对应包目录下的锁文件即可恢复正常操作。
内容的提问来源于stack exchange,提问作者kutschkem
相关产品推荐
相关产品推荐

