Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 具有2个线程的全局变量的最小值和最大值_Multithreading - Fatal编程技术网

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

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个

我有一个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个线程尝试增加它


在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