派生实例

多个模糊器实例可以通过不同的方式产生。

手动,通过一个TCP端口

做多线程的直接方法是使用 LlmpRestartingEventManager,特别是使用 setup_restarting_mgr_std

它抽象化了所有讨厌的细节,如崩溃处理时的重启 (针对内存模糊器) 和多线程。 有了它,你手动启动的每个实例都会尝试连接到本地机器上的一个 TCP 端口。

如果这个端口还没有被绑定,这个实例就会成为代理,它自己会绑定到这个端口以等待新的客户。

如果该端口已经被绑定,EventManager 将尝试连接到它。 该实例成为客户端,现在可以与所有其他节点通信。

手动启动节点的好处是,你可以有多个具有不同配置的节点,比如客户端在有 ASAN 和没有 ASAN 的情况下进行模糊处理。

虽然它被称为 restarting 管理器,但它在Unix操作系统上使用 fork 作为优化,在 Windows 上只实际从头开始重启。

启动器 Launcher

启动器(Launcher) 是 lazy 模式启动多线程。

你可以使用 Launcher::builder 来创建一个产生多个节点的模糊器,所有这些节点都使用重新启动的事件管理器。

看一个例子:

    Launcher::builder()
        .configuration(EventConfig::from_name(&configuration))
        .shmem_provider(shmem_provider)
        .monitor(mon)
        .run_client(&mut run_client)
        .cores(cores)
        .broker_port(broker_port)
        .stdout_file(stdout_file)
        .remote_broker_addr(broker_addr)
        .build()
        .launch()

首先启动一个代理,然后根据传递给 cores 的值生成 n 个客户端。 这个值是一个字符串,表示要绑定的核心,例如, 0,2,50-3。 对于每个客户端,run_client 将被调用。 在Windows上,启动器将重新启动每个客户端,而在Unix上,它将使用fork

其他方式

LlmpEvenManager 系列是派生实例的最简单的方法,但对于不明显的目标,你可能需要想出其他的解决方案。

LLMP 甚至在理论上是 no_std 兼容的,甚至完全不同的 EventManagers 也可以用于消息传递。

如果你遇到这种情况,请阅读当前的实现或与我们联系。