以下代码是一个原子指针类的框架,它取自PARSEC基准套件中用于共享内存多处理器的模拟退火应用程序.
在该应用中,中央数据结构是图(更具体地,集成电路的网表).图中的每个节点都有一个指示其物理位置的属性.该算法产生许多线程并且每个线程重复并随机选择两个节点并交换它们的物理位置,如果这导致芯片的更好的路由成本.
因为图形很大并且每个线程都可以选择任何一对节点,所以唯一可行的解决方案是无锁并发数据结构(CDS).这就是为什么以下AtomicPtr
类是至关重要的(它用于以无锁方式原子地交换指向两个物理位置对象的指针).该函数atomic_load_acq_ptr()
是在汇编代码中定义的并且与之紧密对应std::atomic<T*>::load(memory_order_acquire)
.
我想用C++ 11原子实现该CDS.
template <typename T>
class AtomicPtr {
private:
typedef long unsigned int ATOMIC_TYPE;
T *p __attribute__ ((aligned (8)));
static const T *ATOMIC_NULL;
inline T *Get() const {
T *val;
do {
val = (T *)atomic_load_acq_ptr((ATOMIC_TYPE *)&p);
} while(val == ATOMIC_NULL);
return val;
}
inline void Swap(AtomicPtr<T> &X) {
// Define partial order in which to acquire elements to prevent deadlocks
AtomicPtr<T> *first;
AtomicPtr<T> *last;
// Always process elements …
Run Code Online (Sandbox Code Playgroud) 该工具(在此回购中)包含3个类(如下所示).问题是如何让我的ParaTracer.Logger
班级在我的每个班级中都可见(如下java.util.Random
图所示).该声明cp.importPackage( "ParaTracer.Logger");
似乎不起作用,我收到此错误:
java.lang.NoClassDefFoundError: ParaTracer/Logger
at java.util.Random.nextLong(Random.java)
我尝试Logger
在每个检测类中动态加载类.但似乎我使用Class.getMethod()
不正确,或者Javassist编译器太原始无法编译动态类加载代码.我收到此错误:
javassist.CannotCompileException: [source error] getMethod(java.lang.String,java.lang.Class,java.lang.Class) not found in java.lang.Class
将以下3个类导出到JAR文件中,并使用MANIFEST.MF文件定义,Premain-Class
并在使用该开关运行任何已检测程序时传递给JVM:
-javaagent:/Path/To/ParaTracerAgent.jar
这是3个班级.
package ParaTracer;
import java.lang.instrument.Instrumentation;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.CtNewConstructor;
import javassist.CtNewMethod;
public class ParaTracer {
private static volatile Instrumentation instr;
public static void premain(String agentArgs, Instrumentation inst) {
instr = inst;
SimpleClassTransformer transformer = new SimpleClassTransformer();
inst.addTransformer( transformer, false );
}
}
Run Code Online (Sandbox Code Playgroud)
变压器类: …