3

我一直在为需要多线程支持的编程语言开发解析器。在调查我的编译器的后端应该是什么时,我注意到我找不到很多关于多线程的信息,比如 CIL、LLVM IR、gcc RTL 或 JVM 字节码。我可以找到一些关于如何使此类代码线程安全的参考资料,但没有关于如何创建或派生线程的信息。我当然可以使用信号或其他东西直接与操作系统交互,但这是不可移植且容易出错的。

是不是根本就没有可移植的方式来管理这些低级语言中的线程?我应该编译成像 C 这样的高级语言吗?

4

1 回答 1

2

在 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
}

这段代码是完全可移植的。

于 2014-02-04T23:28:23.400 回答