小编sle*_*row的帖子

如何可靠地清理执行阻塞IO的Rust线程?

在Rust中生成阻塞IO的线程似乎是一个常见的习惯用法,因此您可以使用非阻塞通道:

use std::sync::mpsc::channel;
use std::thread;
use std::net::TcpListener;

fn main() {
    let (accept_tx, accept_rx) = channel();

    let listener_thread = thread::spawn(move || {
        let listener = TcpListener::bind(":::0").unwrap();
        for client in listener.incoming() {
            if let Err(_) = accept_tx.send(client.unwrap()) {
                break;
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

问题是,重新加入这样的线程取决于生成的线程"意识到"通道的接收端已经被丢弃(即,调用send(..)返回Err(_)):

drop(accept_rx);
listener_thread.join(); // blocks until listener thread reaches accept_tx.send(..)
Run Code Online (Sandbox Code Playgroud)

你可以为TcpListeners 创建虚拟连接,并TcpStream通过克隆关闭s,但这些似乎是清理这些线程的真正hacky方法,而且就目前而言,我甚至不知道在读取时触发线程阻塞的黑客攻击stdin加入.

我怎样才能清理这些线程,或者我的架构是错的?

multithreading channel blocking rust

10
推荐指数
1
解决办法
1171
查看次数

声明类抽象是不好的设计,因为它只有静态成员?

我的项目中有一个用于加载外部资源(即图像和音频文件)的类.该类只有几个成员:用于存储资源的HashMap字段,以及getImage(reference)用于检索资源的方法等.

我最初实现了单例模式,但后来我在链接页面上阅读了一些批评,并考虑使用静态成员.

在愉快地决定静态地实现所有类功能之后很久,我正在做一些代码清理.在这样做时,我意识到没有什么能阻止我实例化这个ResourceManager类.这导致我用abstract关键字标记它.

我以前从未用过abstract这种方式; 我只是传统上为继承树应用它.我尝试使用谷歌搜索和滥用abstract,但我找到的所有资源似乎都不太值得信赖,或者没有建议不要以这种方式使用抽象:

Oracle关于抽象类和方法的教程.
另一个讨论关键字的网站.

从第二个链接引用:"它的目的是纯粹作为类的父级服务."

我的新实施是传统的,可原谅的,还是仅仅是错误的?

java singleton static abstract

3
推荐指数
1
解决办法
99
查看次数

标签 统计

abstract ×1

blocking ×1

channel ×1

java ×1

multithreading ×1

rust ×1

singleton ×1

static ×1