全局变量在2个线程中的最小值和最大值。

8

我有一个for循环,如下所示:
int c = 0 ;
for(int i=0 ; i<100 ; i++)
c++;

其中C是一个全局变量。
如果我使用2个线程运行此代码,并且在c++部分没有锁定线程,那么C的最小和最大最终值是多少?为什么?


最好定义变量 c 的类型和初始值。 - Alex F
这个回答解决了你的问题吗?[在没有同步的情况下由两个线程访问的计数器的最小值] (https://stackoverflow.com/questions/46040473/minimum-value-of-a-counter-accessed-by-two-threads-without-synchronization) - limido
5个回答

21

如果你将增量代码翻译成汇编语言,它的伪代码将类似于:

1-mov ax,mem[c]
2-inc ax
3-mov mem[c],ax

如果我们有2个线程,考虑以下情况:

thread 1: line 1
thread 2: line (1-2-3) for 99 times
thread 1: line (2-3)
thread 2: line 1
thread 1: line (1-2-3) for remaining 99 times
thread 2: line (2-3) for the last time

现在 c 的值为2,所以最小值为2。


1

我的答案是最小1,最大200。

正如Kibo所提到的,增量代码看起来像:
1-mov ax,mem [c]
2-inc ax
3-mov mem [c],ax

现在让我们用for(int i = 0; i <3; i ++)运行一个示例

T1线1 |==> ax = 0; mem[c]=0;
T1线2 |==> ax = 1; mem[c]=0;
T2线1 |==> ax = 0; mem[c]=0;
T1线3 |==> ax = 0; mem[c]=0;
T2线2 |==> ax = 1; mem[c]=0;
T1线1 |==> ax = 0; mem[c]=0;
T2线3 |==> ax = 0; mem[c]=0;
T1线2 |==> ax = 1; mem[c]=0;
T2线1 |==> ax = 0; mem[c]=0;
T1线3 |==> ax = 0; mem[c]=0;
T2线2 |==> ax = 1; mem[c]=0;
T1线1 |==> ax = 0; mem[c]=0;
T2线3 |==> ax = 0; mem[c]=0;
T1线2 |==> ax = 1; mem[c]=0;
T2线1 |==> ax = 0; mem[c]=0;
T1线3 |==> ax = 0; mem[c]=0;
T2线2 |==> ax = 1; mem[c]=0;
T2线3 |==> ax = 1; mem[c]=1;

对于i=200同样适用


0

最小值: c+100 如果Thread2在Thread1覆盖之前复制了c。

最大值: c + 200 如果两个线程按顺序进行


0
假设初始值为c=0 最大值将是200 这将发生在每个线程依次执行c++,但在单个迭代中。
最小值将是100 这是因为c++基本上是:
temp = c + 1 //line1
c = temp //line2

假设第一个线程执行了line1,然后第二个线程执行了line。它们将设置相同的值。所以在那个迭代中,c只会增加1,即使有两个线程试图增加它。

在Java中,为了使其线程安全:将c声明为AtomicInteger并使用c.addAndGet()来递增它。


0

最小值将为c + 100。 最大值将为c + 200。

当线程彼此运行时,它们可能在另一个线程更新之前同时取相同的c值。在这种情况下,两者都会将c更新为相同的值。

如果在最坏情况下发生这种情况(您循环函数的次数),则该值仅更新该数量的次数。

如果从未发生过这种情况(您的最佳情况),例如线程没有同时运行,则该值将按您想要的次数进行更新。


1
我最近在面试中被问到同样的问题,但这里稍微更改了一下数值。c=0; for(int i=0 ; i<4 ; i++) c++; // 有5个线程同时作用于此我的回答是:最大值为25,最小值为5。 但是面试官说最小值是2。您能解释一下我哪里错了吗? - Ashwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接