我正在尝试使用stdatomic.h函数,尤其是atomic_flag_test_and_set。我没有看到任何错误,但是想知道我在做什么总是安全的。我有一个类似下面的结构:
typedef struct Mystruct {
int somedata;
atomic_flag flag;
} Mystruct;
稍后,当我创建一个mystruct并使用其标志实例时,我这样做是这样的:
if(atomic_flag_test_and_set(&mystructInstance->flag)) {
// do something
}
评估&mystructInstance->flag
总是在原子操作检查之前完成吗?我认为是这样,因为它应该是一个处理器指令(或模仿一个处理器指令的东西),但是我想确定一下。
评估
&mystructInstance->flag
总是在原子操作检查之前完成吗?
这个问题的答案可以在C标准的“函数调用”部分中找到。
6.5.2.2函数调用
...
4.参数可以是任何完整对象类型的表达式。在准备调用函数时,将评估参数,并为每个参数分配相应参数的值。
还要注意,如果一个函数接受多个参数,则传递给它的参数的求值顺序是不确定的。在标准的同一部分中也提到了这一点。
10.在函数标志符和实际参数的求值之后,但在实际调用之前,有一个顺序点。相对于被调用函数的执行,在执行被调用函数的主体之前或之后没有明确指定顺序的调用函数中的每个评估(包括其他函数调用)都是不确定的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句