multithreading - 如何在线程之间共享处理程序?

标签 multithreading rust

我正在编写一个多线程网络服务器,基本上我需要复制一个 Vec<Handler>服务器启动时跨多个线程的用户提供的处理程序对象。我尝试了几种方法:

1) 将 Handler 定义为具有 fn process(&mut self, Request) -> Response 的特征方法。用户将为每个处理程序结构实现它。这种方法在 C++ 或 Python 等语言中很常见。问题是 Rust 不允许我复制或克隆特征对象,因为这意味着 Sized绑定(bind)在它上面,这在特征对象上是被禁止的。

2) 将处理程序定义为 Box<FnMut(Request) -> Response> .这不起作用,因为闭包不可复制。

3) 我可以在线程之间共享相同的对象,但这对我来说意义不大,因为我需要一个互斥体,当我实际上只需要跨线程的单独副本时,它会引入无用的争用。

如何正确实现?

最佳答案

最简单的解决方案是要求用户定义克隆方法。

trait Handler {
    fn process(&mut self, r: Request) -> Response;
    fn duplicate(&self) -> Box<Handler>;
}

然后你可以复制你的Vec<Box<Handler>>很容易。

关于multithreading - 如何在线程之间共享处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39867556/

相关文章:

java - 如何执行一个可调用的固定次数并在每次执行之间有一个 sleep 间隔/延迟

java - xuggle并发转码

multithreading - 为什么线程池工作项在UI线程上执行?

reference - 为什么 &mut 的引用弱化发生在某些特征方法调用中?

rust - 如何向 `Child` 子进程发送信号?

multithreading - 为什么 Condvar 不唤醒最后一个线程?

python - ThreadPoolExecutor能否帮助单线程应用效率提升?

rust - 在 Rust 中修剪集合的输入行

rust - 使用参数调用 libc::c_void-Pointer 作为 Rust 中的函数

vector - 如何从函数中的Vec返回单个元素?