multithreading - 字节码/中间语言/编译器后端的可移植多线程支持?

标签 multithreading compiler-construction bytecode cil llvm-ir

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

在这些低级语言中是否根本没有可移植的方式来管理线程?我应该编译成像 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
}

此代码是完全可移植的。

关于multithreading - 字节码/中间语言/编译器后端的可移植多线程支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21565377/

相关文章:

c++ - 如何初始化大线程本地对象?

c++ - 在基类中调用真正的虚函数

c - 静态链接 ncurses 到程序

c++ - 来自 std::vector of objects 的 memcpy 底层数据

java - 如何修复反编译 .class 为 .java 错误

bytecode - 内联方法体中 invokevirtual 的意外指令和参数

multithreading - 利用 SLURM 上的所有 CPU

java - 当线程在某个循环中执行长任务时如何中断线程?

python - 通过解释器变异混淆 python 字节码

java - 是否有可能追踪到哪个表达式导致了 NPE?