具有2个线程的全局变量的最小值和最大值

时间:2013-04-17 09:31:59

标签: multithreading

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

其中C是全局变量 如果我使用2个线程运行此代码,如果我没有锁定C部分中的线程以及如何执行,那么c++的最小值和最大值是什么?

5 个答案:

答案 0 :(得分:13)

如果将增量代码转换为汇编代码,它的伪代码将如下:

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 :(得分:0)

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

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

答案 2 :(得分:0)

假设c=0最初

最大值为200

如果每个线程在一次迭代之后执行c++,那就会发生这种情况。

最小值为100

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

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

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

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

答案 3 :(得分:0)

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

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

如果在最坏的情况下(循环函数的次数)发生这种情况 该值只会更新一次。

如果这种情况从未发生过(最好的情况),例如线程没有同时运行,那么该值将更新您希望它们的次数。

答案 4 :(得分:0)

我的回答是最低1和最高200。

正如Kibo所说,增量代码如下:
1-mov ax,mem [c]
2-inc ax
3-mov mem [c],ax

现在让我们用for(int i = 0; i&lt; 3; i ++)

运行一个例子

T1第1行| ==&gt; ax = 0; MEM [C] = 0;
T1第2行| ==&gt; ax = 1; MEM [C] = 0;
T2行1 | ==&gt; ax = 0; MEM [C] = 0;
T1第3行| ==&gt; ax = 0; MEM [C] = 0;
T2行2 | ==&gt; ax = 1; MEM [C] = 0;
T1第1行| ==&gt; ax = 0; MEM [C] = 0;
T2第3行| ==&gt; ax = 0; MEM [C] = 0;
T1第2行| ==&gt; ax = 1; MEM [C] = 0;
T2行1 | ==&gt; ax = 0; MEM [C] = 0;
T1第3行| ==&gt; ax = 0; MEM [C] = 0;
T2行2 | ==&gt; ax = 1; MEM [C] = 0;
T1第1行| ==&gt; ax = 0; MEM [C] = 0;
T2第3行| ==&gt; ax = 0; MEM [C] = 0;
T1第2行| ==&gt; ax = 1; MEM [C] = 0;
T2行1 | ==&gt; ax = 0; MEM [C] = 0;
T1第3行| ==&gt; ax = 0; MEM [C] = 0;
T2行2 | ==&gt; ax = 1; MEM [C] = 0;
T2第3行| ==&gt; ax = 1; MEM [C] = 1;

同样适用于i = 200