发布于2024-11-02 21:05 阅读(502) 评论(0) 点赞(9) 收藏(2)
我对 SPECIAL POPL ISSUE《Java 内存模型》论文中的图 3 感到困惑。
示例(第 5 页,图 3):
Initially, x == y == 0
Thread 1 -> r1 = x; y = r1;
Thread 2 -> r2 = y; r3 = r2 | 1; x = r2;
r1 == r2 == r3 == 1 is legal behavior.
解释 1(第 5 页,1.2 因果循环):图 3 中可以看到另一个因果循环示例(这次是描述可接受行为的示例)。为了查看结果r1 == r2 == r3 == 1
,其中一个线程必须在执行读取之前执行写入。但每个写入似乎都依赖于其上方的读取。虽然这个值似乎也是凭空而来的,但它并非如此,并且可以由标准编译器转换产生,如第 2.2.2 节所述。
解释 2(第 10 页,2.2.2 依赖性突破分析和转换):图 3 显示了类似但更令人惊讶的行为。在这种情况下,编译器必须执行更深入的分析,以确定 x 和 y 的值是否保证为 0 或 1。一种可能的分析是确定在程序中表示整数值所需的位宽的分析 [Stephenson 等人,2000 年]。
在这个例子中,r1 和 r2 只能是== 1
且if x or y == 1
只能x or y could be == 1
是if r1 and r2 == 1
。但是的赋值1
我只能在中找到,所以r3 = r2 | 1;
在我看来,没有办法1
得到r1
、r2
或x
。y
那么,这个例子是错误的还是我错了?
你说得对。示例错误。应该是:
Initially, x == y == 0
Thread 1 -> r1 = x; y = r1;
Thread 2 -> r2 = y; r3 = r2 | 1; x = r3;
您可以在Jeremy Manson 的博士论文图 1.3 中看到正确示例。
作者:黑洞官方问答小能手
链接:http://www.javaheidong.com/blog/article/691853/7abe6388a84e2848425d/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!