Вроде бы общие идиомы в Русте порождалась нитью для блокировки ввода-вывода, так что вы можете использовать неблокирующие каналы:Как я могу надежно очистить потоки ржавчины, выполняя блокировку 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;
}
}
});
}
Проблема, присоединяясь темами, как это зависит от породившей нити «реализация "что приемный конец канала уронили (т.е., вызов send(..)
возвращается Err(_)
):
drop(accept_rx);
listener_thread.join(); // blocks until listener thread reaches accept_tx.send(..)
Вы можете сделать фиктивные соединения для TcpListener
с, и отключение TcpStream
сек через клона, но они, кажется, как на самом деле Hacky способы очистки таких читает, и в его нынешнем виде я даже не знаю об ошибке hack, чтобы вызвать блокировку потока при чтении от stdin
.
Как я могу очистить такие темы, или моя архитектура просто не так?
Общий шаблон для потоков, которые невозможно очистить с надежностью, - это уведомить их о необходимости очистки, просто дать им возможность работать и убедиться, что они больше не производят побочных эффектов. Для TcpListener это неприемлемо, но часто для исходящих запросов или операций с файлами. – usr
@usr Да, но я ищу решение для ржавчины. (Мне кажется, это не обязательно подходит для этой формы). Я задал этот вопрос, потому что мне не удалось найти способ использования текущего (безопасного) API. – sleeparrow
http://www.rust-lang.org/ – sleeparrow