Zig语言break跳出代码块后defer是否执行?代码中unlock时机问询
Zig语言中break与defer的执行问题
问题1:break跳出代码块后defer是否会被调用?
- 在Zig语言中,defer语句的执行时机是其所在作用域退出时,不管作用域是正常执行完毕,还是通过
break、return、panic等方式提前退出,defer都会被调用。所以当用break跳出代码块时,对应的defer语句一定会执行。
问题2:代码片段中unlock的执行时机分析
先看代码片段:
var input_data: InputState = blk: { user.input_mutex.lock(); defer user.input_mutex.unlock(); break :blk user.input; };
执行顺序如下:
- 首先调用
user.input_mutex.lock()获取锁; - 声明
defer user.input_mutex.unlock(),该语句会被注册到当前blk:标记的代码块的退出逻辑中; - 执行
break :blk user.input,跳出blk代码块,此时触发该代码块的退出逻辑; - 执行之前注册的defer语句——
user.input_mutex.unlock()。
所以,unlock调用是在break之后执行的。
内容的提问来源于stack exchange,提问作者SilbinaryWolf
相关产品推荐
相关产品推荐

