gpt4 book ai didi

c - 递增同一全局变量时线程如何表现?

转载 作者:行者123 更新时间:2023-11-30 20:30:13 28 4
gpt4 key购买 nike

请您解释一下以下尝试增加全局变量 c 的代码中的差异

我不清楚为什么第一种情况下最大值为 20,而第二种情况下最大值为 10。

void * increment(void *vptr)
{ int i;
for (i = 0; i < 10; i++) {
c++
}
return(NULL);
}


void * increment(void *vptr)
{ int i, val;
for (i = 0; i < 10; i++) {
val = c;
c= val+1;
}
return(NULL);
}

最佳答案

如前所述,2 个线程运行上述任一函数都可能导致 c20。使用多线程时,无法保证两个线程同时或以相同的速度运行。一个线程可能会在另一个线程启动之前完成,这由操作系统、硬件等决定。因此,除非您正确防止race conditions,否则您不能依赖结果。 。

话虽如此,这两个函数执行的操作之间存在差异。具体来说,一个直接递增全局变量(可能是单个处理器指令),而另一个将值复制到局部变量,并将该局部值 + 1 赋回全局变量。

对于您所描述的特定输出,操作顺序如下所示:

案例1:

  1. c 初始化:c = 0
  2. 线程 1 递增 c:c = 1
  3. 线程 2 递增 c:c = 2
  4. 线程 1 递增 c:c = 3
  5. 线程 2 递增 c:c = 4
  6. 线程 1 递增 c:c = 5
  7. 线程 2 递增 c:c = 6
  8. 线程 1 递增 c:c = 7
  9. 线程 2 递增 c:c = 8。 。 .

案例2:

  1. c 初始化:c = 0
  2. 线程 1 存储 c:c = 0, val = 0
  3. 线程 2 存储 c:c = 0, val = 0
  4. 线程 1 将 val+1 分配给 c:c = 1
  5. 线程 2 将 val+1 分配给 c:c = 1
  6. 线程 1 存储 c:c = 1, val = 1
  7. 线程 2 存储 c:c = 1, val = 1
  8. 线程 1 将 val+1 分配给 c:c = 2
  9. 线程 2 将 val+1 分配给 c:c = 2。 。 .

但是,运行第二个函数的 2 个线程没有理由不能按照以下顺序生成 20:

  1. c 初始化:c = 0
  2. 线程 1 存储 c:c = 0, val = 0
  3. 线程 1 将 val+1 分配给 c:c = 1
  4. 线程 2 存储 c:c = 1, val = 1
  5. 线程 2 将 val+1 分配给 c:c = 2
  6. 线程 1 存储 c:c = 2, val = 2
  7. 线程 1 将 val+1 分配给 c:c = 3
  8. 线程 2 存储 c:c = 3, val = 3
  9. 线程 2 将 val+1 分配给 c:c = 4。 。 .

关于c - 递增同一全局变量时线程如何表现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54751774/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com