在原子变量上使用 = 运算符?

问题描述 投票:0回答:2

在这种情况下

newNode->next = NULL;
是未定义的行为吗?

struct node {
  int value;
  _Atomic(struct node*) next
};

//at the initialization stage
struct node* newNode = malloc(sizeof(struct node));
newNode->next = NULL; //other threads are not able to access this node at this point
c multithreading concurrency atomic c11
2个回答
0
投票

这不是“按见”的 UB。

什么时候可能会发生未定义的行为?

如果出现以下情况,可能会发生未定义的行为:

  • 对象未正确分配(例如,malloc 失败并返回 NULL)。
  • 分配在多个线程中同时发生,没有适当的同步。在这种情况下,应该使用像
    atomic_store
    这样的原子操作。

0
投票

行 newNode->next = NULL;是安全的,不会导致未定义的行为,除非您错过以下几点: 1)内存分配成功。 2)初始化时其他线程无法访问newNode。

© www.soinside.com 2019 - 2024. All rights reserved.