首页 > 解决方案 > C中的原子参数执行顺序

问题描述

我正在尝试使用 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总是在检查原子操作之前完成?我会这样假设,因为它应该是一个处理器指令(或模拟一个处理器指令的东西),但我想确定。

标签: catomic

解决方案


的评估是否&mystructInstance->flag总是在检查原子操作之前完成?

这个问题的答案可以在 C 标准的“函数调用”部分找到。

6.5.2.2 函数调用
...
4. 参数可以是任何完整对象类型的表达式。在准备调用函数时,会评估参数,并为每个参数分配相应参数的值。

另请注意,如果一个函数接受多个参数,则传递给它的参数的评估顺序是未指定的。这也在标准的同一部分中提到。

10.在函数指示符和实际参数的评估之后但在实际调用之前有一个序列点。调用函数中的每个求值(包括其他函数调用)在被调用函数的主体执行之前或之后没有特别排序的,相对于被调用函数的执行是不确定的。


推荐阅读