在比赛条件下循环

佐氏

2个进程P0和P1在竞争条件下同时运行。我想计算执行期间x可能采用的最大值和最小值。x的初始值为0

P0:
for( int i=0; i<1000; i++){
   x++;
   x-- ;
   x++;
}

P1:
for( int j=0; j<2000; j++){
   x-- ;
   x++;
}

最大值应为4000,最小值应为-2999。但是即使尝试了很多次,我也无法弄清楚。任何形式的帮助将不胜感激!提前致谢。

德瓦什·德赛

代码247

理解此问题的关键在于查看每次递增和递减生成的汇编代码。

每个后增量将生成以下代码:

 ld [%fp-4], %l0
 add %l0, 1, %l0
 st %l0, [%fp-4]

每个递减后将生成以下代码:

 ld [%fp-4], %l0
 sub %l0, 1, %l0
 st %l0, [%fp-4]

现在,您正在学习并发性,如果您选择不使用互斥锁和其他并发控制技术,则上述汇编指令实际上可以不确定的方式执行

现在,这是我们如何获得最大值4000的值。

这是代码将如何执行:

P0:
for( int i=0; i<1000; i++){
   x++;   //lets call this step 1
   x-- ;  //step 2
   x++;   //step 3
}

P1:
for( int j=0; j<2000; j++){
   x-- ;  //step a (using letters to denote difference in processes)
   x++;   //step b
 }

您的代码将以以下方式执行以实现最大值:

step 1
step a
step b
step 2
step 3

现在,这里的关键是要识别您的读取和写入将变得很脏这意味着在上面的汇编代码中,加载的值将不会始终反映正确的值。这是如何进行的:

 ld [%fp-4], %l0  //read current value of 'x' for step 1
 add %l0, 1, %l0  //performs increments
 st %l0, [%fp-4]  //stores value from step 1 
 ld [%fp-4], %l0  //begins read for step a
 sub %l0, 1, %l0  //performs decrement
 ld [%fp-4], %l0  //performs a DIRTY-READ for step b (notice step a hasn't finished executing)
 add %l0, 1, %l0  //performs increment
 st %l0, [%fp-4]  //stores value from increment (value from decrement is now outdated and lost) (this is a dirty write)
 st %l0, [%fp-4]  //stores value from decrement (this value is actually lost)(this is a dirty write)

从上面的执行中,您可以看到程序集将交织在一起,并且如果没有适当地使用并发,您将不会在堆栈上持久存储正确的'x'值这样您将获得4000,因为在程序集的某些排列中,您将连续地连续处理4个增量运算符,而递减运算符的结果将无法正确保存。以同样的方式,您将通过依次执行减量运算符而没有正确地将x的值持久保留在增量运算符之后来获得-2999的值。

请让我知道,如果你有任何问题!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在R条件下循环

来自分类Dev

Python:在Elif条件下循环

来自分类Dev

循环条件下rand()的行为

来自分类Dev

While条件下循环打印整数

来自分类Dev

在for循环条件下反复调用getter

来自分类Dev

在for循环的条件下多次调用属性吗?

来自分类Dev

将复合语句置于for循环的条件下

来自分类Dev

在某些情况下,在循环条件下线程冲突

来自分类Dev

在循环条件下评估表达式

来自分类Dev

在循环条件下使用count($ arr)可以吗

来自分类Dev

在循环条件下使用逻辑运算符

来自分类Dev

在while循环条件下如何执行多个命令?

来自分类Dev

如何在if条件下循环增加迭代器?

来自分类Dev

while循环条件下的语法是什么?

来自分类Dev

如何在多个条件下进行适当的for循环?

来自分类Dev

while循环条件下的is_double函数

来自分类Dev

R:在循环条件下取行总和

来自分类Dev

While循环不会在错误条件下退出

来自分类Dev

简化两组条件下的循环

来自分类Dev

C ++:在循环条件下创建int数组的问题

来自分类Dev

在循环条件下使用数学类方法很慢吗?

来自分类Dev

如何创建循环以在给定条件下分配值?

来自分类Dev

IFDEF在if条件下

来自分类Dev

在 IF 条件下挣扎

来自分类Dev

我打破了Java while()循环-在错误的条件下触发并在正确的条件下冻结

来自分类Dev

如何使具有多个条件的while循环在真实条件下停止?

来自分类Dev

在IN条件下使用Order By

来自分类Dev

IF条件下的NULLS计数

来自分类Dev

SQL:在条件下与OR结合