8

我有一个 for 循环
int c = 0 ;
for(int i=0 ; i<100 ; i++)
c++;

其中 C 是一个全局变量。如果我用 2 个线程运行此代码,如果我不锁定部分中的线程,
最小和最大最终值是多少?如何锁定?Cc++

4

5 回答 5

19

如果您将增量代码转换为程序集,它的伪代码将如下所示:

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

于 2013-07-18T21:39:18.310 回答
0

假设c=0最初

最大将是200

如果每个线程c++在一次迭代中彼此相继执行,就会发生这种情况。

敏会是100

那是因为c++基本上是:

temp = c + 1 //line1
c = temp //line2

假设第一个线程执行 line1,然后第二个线程在该迭代中执行 line . The same value will be set. Soc will only increase by1`,即使 2 个线程尝试增加它。

在 Java 中,使其成为线程安全的:声明cAtomicInteger并执行c.addAndGet()以递增它

于 2013-04-17T09:43:31.993 回答
0

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

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

于 2013-04-17T09:34:04.617 回答
0

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

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

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

如果这永远不会发生(您最好的情况),例如线程没有同时运行,则该值将更新您希望它们的次数。

于 2013-04-17T09:44:31.630 回答
0

我的答案是最小 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

于 2018-03-05T14:25:09.167 回答