原子参数在C中的执行顺序

时间:2018-12-18 02:30:11

标签: c atomic

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

1 个答案:

答案 0 :(得分:2)

  

func update<T: Object>(object: T, for dictionary: [String: Any]) { do { try realm.write { for (key,value) in dictionary { object.setValue(value, forKey: key) } } } catch { post(error) } } 的评估是否始终在原子操作检查之前完成?

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

  

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

还请注意,如果一个函数使用多个参数,则传递给该参数的参数的评估顺序为未指定。在标准的同一部分中也提到了这一点。

  

10。在函数标志符和实际参数的求值之后,但在实际调用之前,有一个顺序点。相对于被调用函数的执行,不确定地在被调用函数的主体执行之前或之后对调用函数中的每个求值(包括其他函数调用)进行不确定的排序。