Multithreading 具有2个线程的全局变量的最小值和最大值
我有一个for循环,如Multithreading 具有2个线程的全局变量的最小值和最大值,multithreading,Multithreading,我有一个for循环,如 intc=0对于(int i=0;i最小值: c+100 如果Thread2在Thread1覆盖之前复制c 最大值: c+200 如果两个线程按顺序进行假设c=0初始 最大值为200 如果每个线程在一次迭代中相继执行c++,就会发生这种情况 最小值为100 这是因为c++基本上是: temp = c + 1 //line1 c = temp //line2 假设第一个线程执行line1,然后第二个线程执行line。将设置相同的值。 因此c在该迭代中只会增加1`即使有2个
intc=0
对于(int i=0;i最小值:
c+100
如果Thread2在Thread1覆盖之前复制c
最大值:
c+200
如果两个线程按顺序进行假设c=0
初始
最大值为200
如果每个线程在一次迭代中相继执行c++
,就会发生这种情况
最小值为100
这是因为c++
基本上是:
temp = c + 1 //line1
c = temp //line2
假设第一个线程执行line1,然后第二个线程执行line。将设置相同的值。
因此
c在该迭代中只会增加
1`即使有2个线程尝试增加它
在Java中,要使其线程安全:将c
声明为AtomicInteger
并执行c.addAndGet()
以使其递增最小值将为c+100。
最大值为c+200
当线程相邻运行时,它们可能会在被另一个线程更新之前同时接受相同的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,我的答案是最小值是1,最大值是200
正如Kibo提到的,增量代码如下所示:
1-mov ax,mem[c]
2-inc ax
3-mov mem[c],ax
现在让我们运行一个示例,其中for(int i=0;i 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定义c
的类型及其初始值是一个好主意。这是否回答了您的问题?我最近在一次采访中被问到了同样的问题,但值略有变化。c=0;for(int i=0;i