我一直在为需要多线程支持的编程语言开发解析器。在调查我的编译器的后端应该是什么时,我注意到我找不到很多关于多线程的信息,比如 CIL、LLVM IR、gcc RTL 或 JVM 字节码。我可以找到一些关于如何使此类代码线程安全的参考资料,但没有关于如何创建或派生线程的信息。我当然可以使用信号或其他东西直接与操作系统交互,但这是不可移植且容易出错的。
是不是根本就没有可移植的方式来管理这些低级语言中的线程?我应该编译成像 C 这样的高级语言吗?
我一直在为需要多线程支持的编程语言开发解析器。在调查我的编译器的后端应该是什么时,我注意到我找不到很多关于多线程的信息,比如 CIL、LLVM IR、gcc RTL 或 JVM 字节码。我可以找到一些关于如何使此类代码线程安全的参考资料,但没有关于如何创建或派生线程的信息。我当然可以使用信号或其他东西直接与操作系统交互,但这是不可移植且容易出错的。
是不是根本就没有可移植的方式来管理这些低级语言中的线程?我应该编译成像 C 这样的高级语言吗?
在 JVM 字节码中,您可以使用任何 Java 库,包括那些使用线程的库。创建线程的传统方法是
new Thread() {
@Override
public void run() {
/// code
}
}.start();
此代码是用 Java 编写的。使用javap可以看到对应的JVM字节码:
0: new #2 // class Main$1
3: dup
4: invokespecial #3 // Method Main$1."<init>":()V
7: invokevirtual #4 // Method Main$1.start:()V
10: return
Main$1 是一个类:
final class Main$1 extends java/lang/Thread {
// compiled from: Intf.java
OUTERCLASS Main main ([Ljava/lang/String;)V
// access flags 0x8
static INNERCLASS Main$1 null null
// access flags 0x0
<init>()V
L0
LINENUMBER 7 L0
ALOAD 0
INVOKESPECIAL java/lang/Thread.<init> ()V
RETURN
L1
LOCALVARIABLE this LMain$1; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x1
public run()V
L0
LINENUMBER 11 L0
RETURN
L1
LOCALVARIABLE this LMain$1; L0 L1 0
MAXSTACK = 0
MAXLOCALS = 1
}
这段代码是完全可移植的。