我现在正在玩X10,我有多个例外。这是我创建的代码:
Main.x10
public class Main {
// main Method for the Main class
public static def main(argv:Rail[String]) {
Console.OUT.println("This is the main place. (ID="+here.id+")");
val dataItem = new Data();
// no global reference, data is copied to each place.
finish for (p in Place.places()) {
at (p) async {
Console.OUT.println("This is place no: "+here.id+". The value of dataItem is "+dataItem.getValue()+".");
dataItem.incValue();
}
}
Console.OUT.println("Final value of dataItem without GlobalRef in multiple places at place "+here.id+": "+dataItem.getValue());
dataItem.setValue(0);
finish for (p in Place.places()) {
async {
Console.OUT.println("This is place no: "+here.id+". The value of dataItem is "+dataItem.getValue()+".");
dataItem.incValue();
}
}
Console.OUT.println("Final value of dataItem without GlobalRef in one place at place "+here.id+": "+dataItem.getValue());
dataItem.setValue(0);
val globalRefDataItem = GlobalRef[Data](dataItem);
finish for (p in Place.places()) {
at (p) async {
val globalDataItemUnwrapped = globalRefDataItem();
Console.OUT.println("This is place no: "+here.id+". The value of dataItem is "+globalDataItemUnwrapped.getValue()+".");
atomic globalDataItemUnwrapped.incValue();
}
}
Console.OUT.println("Final value of dataItem with GlobalRef in multiple places at place "+here.id+": "+dataItem.getValue());
}
}
Data.x10
public class Data{
private var value:Long;
def getValue():Long{
return value;
}
def setValue(value:long){
this.value = value;
}
def incValue(){
this.value = this.value+1;
}
}
X10DT中的输出如下:
This is the main place. (ID=0)
This is place no: 3. The value of dataItem is 0.
This is place no: 1. The value of dataItem is 0.
This is place no: 2. The value of dataItem is 0.
This is place no: 0. The value of dataItem is 0.
Final value of dataItem without GlobalRef in multiple places at place 0: 0
This is place no: 0. The value of dataItem is 0.
This is place no: 0. The value of dataItem is 1.
This is place no: 0. The value of dataItem is 2.
This is place no: 0. The value of dataItem is 3.
Final value of dataItem without GlobalRef in one place at place 0: 4
This is place no: 0. The value of dataItem is 0.
Command used: /home/martze/x10dt/workspace/Example/bin/Main
Uncaught exception at place 0: x10.lang.MultipleExceptions
x10.lang.FailedDynamicCheckException: !(here == x$0.home)
at x10aux::throwException(x10::lang::CheckedThrowable*)
at Main__closure__3::__apply()
at x10::lang::Activity::run()
at x10::lang::Runtime__Worker::loop()
at x10::lang::Runtime__Worker::__apply()
at x10::lang::Runtime__Pool::run()
at
at GC_inner_start_routine
at GC_call_with_stack_base
at
at clone
x10.lang.FailedDynamicCheckException: !(here == x$0.home)
at x10aux::throwException(x10::lang::CheckedThrowable*)
at Main__closure__3::__apply()
at x10::lang::Activity::run()
at x10::lang::Runtime__Worker::loop()
at x10::lang::Runtime__Worker::__apply()
at x10::lang::Runtime__Pool::run()
at
at GC_inner_start_routine
at GC_call_with_stack_base
at
at clone
x10.lang.FailedDynamicCheckException: !(here == x$0.home)
at x10aux::throwException(x10::lang::CheckedThrowable*)
at Main__closure__3::__apply()
at x10::lang::Activity::run()
at x10::lang::Runtime__Worker::loop()
at x10::lang::Runtime__Worker::__apply()
at x10::lang::Runtime__Pool::run()
at
at GC_inner_start_routine
at GC_call_with_stack_base
at
at clone
我尝试使用谷歌搜索,但结果只是指向一些根本没有帮助我的文档。我的环境变量设置为X10_NTHREADS = 1,我将位数设置为4.我正在使用Ubuntu,我正在使用C ++后端。
我该怎么办?这个错误是什么意思?
答案 0 :(得分:1)
GlobalRef
是对特定地点的对象的全局有意义的引用。它可能只在创建它的地方(“家”)被取消引用。在GlobalRef
的解除引用('展开')时会抛出异常:
val globalRefDataItem = GlobalRef[Data](dataItem);
finish for (p in Place.places()) {
at (p) async {
val globalDataItemUnwrapped = globalRefDataItem();
...
}
}
{0}在地点0处创建,但在地点GlobalRef
被取消引用(globalRefDataItem()
)。如果它出现错误将更容易理解:
p
要访问x10.lang.FailedDynamicCheckException: (here != globalRefDataItem.home)
引用的对象,活动必须将位置更改回原位。例如:
GlobalRef
这通常被称为“乒乓”成语 - 活动变为远程位置,然后再次变回原来的位置。
在您的程序中,还需要在增加之前打印dataItem 的值。要执行此操作,请在表达式(X10 language spec§13.3)中使用从远程位置返回值,例如:
val globalRefDataItem = GlobalRef[Data](dataItem);
finish for (p in Place.places()) {
at (p) async {
at(globalRefDataItem.home) {
atomic globalDataItemUnwrapped.incValue();
}
}
}
注意,我对原始代码进行了重要更改,以便在单个finish for (p in Place.places()) {
at (p) async {
val currentValue = at(globalRefDataItem.home) {
val globalDataItemUnwrapped = globalRefDataItem();
var valueBeforeInc:Long = 0;
atomic {
valueBeforeInc = globalDataItemUnwrapped.getValue();
globalDataItemUnwrapped.incValue();
}
valueBeforeInc
};
Console.OUT.println("This is place no: "+here.id+". The value of dataItem is "+currentValue+".");
}
}
块中组合值的获取和增量。如果没有此更改,则另一个活动可能会增加这两个语句之间的值。 X10提供原子类型(例如atomic
),它提供了这样的原子x10.util.concurrent.AtomicLong
操作。