我有一个 for 循环
int c = 0 ;
for(int i=0 ; i<100 ; i++)
c++;
其中 C 是一个全局变量。如果我用 2 个线程运行此代码,如果我不锁定部分中的线程,
最小和最大最终值是多少?如何锁定?C
c++
我有一个 for 循环
int c = 0 ;
for(int i=0 ; i<100 ; i++)
c++;
其中 C 是一个全局变量。如果我用 2 个线程运行此代码,如果我不锁定部分中的线程,
最小和最大最终值是多少?如何锁定?C
c++
如果您将增量代码转换为程序集,它的伪代码将如下所示:
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
假设c=0
最初
最大将是200
如果每个线程c++
在一次迭代中彼此相继执行,就会发生这种情况。
敏会是100
那是因为c++
基本上是:
temp = c + 1 //line1
c = temp //line2
假设第一个线程执行 line1,然后第二个线程在该迭代中执行 line . The same value will be set.
So
c will only increase by
1`,即使 2 个线程尝试增加它。
在 Java 中,使其成为线程安全的:声明c
为AtomicInteger
并执行c.addAndGet()
以递增它
最小值:c+100 如果 Thread2 在 Thread1 覆盖之前复制 c。
最大值:c + 200 如果两个线程按顺序进行
最小值为 c + 100。最大值为 c + 200。
当线程彼此相邻运行时,它们可能会在另一个线程更新之前同时采用相同的 c 值。在这种情况下,两者都会将 c 更新为相同的值。
如果这发生在最坏的情况下(循环函数的次数),则该值将仅更新该次数。
如果这永远不会发生(您最好的情况),例如线程没有同时运行,则该值将更新您希望它们的次数。
我的答案是最小 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; 内存[c]=0;
T1 线 2 |==> ax = 1; 内存[c]=0;
T2 线 1 |==> ax = 0; 内存[c]=0;
T1 第 3 行 |==> ax = 0; 内存[c]=0;
T2 线 2 |==> ax = 1; 内存[c]=0;
T1 线 1 |==> ax = 0; 内存[c]=0;
T2 第 3 行 |==> ax = 0; 内存[c]=0;
T1 线 2 |==> ax = 1; 内存[c]=0;
T2 线 1 |==> ax = 0; 内存[c]=0;
T1 第 3 行 |==> ax = 0; 内存[c]=0;
T2 线 2 |==> ax = 1; 内存[c]=0;
T1 线 1 |==> ax = 0; 内存[c]=0;
T2 第 3 行 |==> ax = 0; 内存[c]=0;
T1 线 2 |==> ax = 1; 内存[c]=0;
T2 线 1 |==> ax = 0; 内存[c]=0;
T1 第 3 行 |==> ax = 0; 内存[c]=0;
T2 线 2 |==> ax = 1; 内存[c]=0;
T2 第 3 行 |==> ax = 1; 内存[c]=1;
同样适用于 i=200