gpt4 book ai didi

c++ - 线程同步 - 微妙的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:07:54 25 4
gpt4 key购买 nike

让我有这个循环:

static a;
for (static int i=0; i<10; i++)
{
a++;
///// point A
}

此循环有 2 个线程进入...

我不确定某事....如果 thread1 进入 POINT A 会发生什么,留在那里,而 THREAD2 进入循环 10 次,但是在第 10 个循环之后将 i 的值递增到 10 ,在检查 i 的值是否小于 10 之前,Thread1 正在退出循环并假设递增 i 并再次进入循环。Thread1 将增加的值是多少(我会看到)?是 10 还是 0 ?

线程 1 是否可能将 i 递增到 1,然后线程 2 将再次进入循环 9 次(它们可能是 8 ,7 等...)

谢谢

最佳答案

你必须意识到递增操作实际上是有效的:

read the value
add 1
write the value back

你必须问问自己,如果其中两个同时发生在两个独立的线程中,会发生什么情况:

static int a = 0;

thread 1 reads a (0)
adds 1 (value is 1)
thread 2 reads a (0)
adds 1 (value is 1)
thread 1 writes (1)
thread 2 writes (1)

对于两个同时递增,您可以看到其中一个可能丢失,因为两个线程都读取了预递增的值。

您给出的示例因静态循环索引而变得复杂,起初我没有注意到。由于这是c++代码,标准实现是静态变量对所有线程可见,因此所有线程只有一个循环计数变量。明智的做法是使用普通的自动变量,因为每个线程都有自己的变量,不需要锁定。

这意味着虽然您有时会丢失增量,但您也可能会获得增量,因为循环本身可能会丢失计数并迭代额外的次数。总而言之,这是不该做的一个很好的例子。

关于c++ - 线程同步 - 微妙的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1922455/

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