首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生锈:将TcpStream移动为可变异的多线程

生锈:将TcpStream移动为可变异的多线程
EN

Stack Overflow用户
提问于 2022-08-24 13:50:53
回答 1查看 90关注 0票数 1

想要将标准IO流绑定到TCP流(工作前):

代码语言:javascript
复制
fn main() {
    let mut stream =TcpStream::connect("localhost:1912").unwrap();
    let stdin = io::stdin();

    for command in stdin.lock().lines()  {
        {
          let mut cmd = command.unwrap();
          cmd = cmd.add("\n");
          _ = stream.write(cmd.as_bytes()).unwrap();
        }

        {
          let mut resp_data = [0 as u8; 250];
          _ = stream.read(&mut resp_data).unwrap();        
          let text = from_utf8(&resp_data).unwrap();
          print!("{}", text);
        }
    }

}

我也想在多线程中这样做:不工作:

代码语言:javascript
复制
fn main() {
    let stream = Arc::new(Mutex::new(TcpStream::connect("localhost:1912").unwrap()));
    
    let str_clone = stream.clone();
    thread::spawn(move || {

        let mut stout = io::stdout();
        let mut str = str_clone.lock().unwrap();
        _ = io::copy(&mut *str, &mut stout);

    });

    let mut stdin = io::stdin();
    let mut str = stream.lock().unwrap();
    _ = io::copy(&mut stdin, &mut *str);
}

我知道一个线程持有一个锁,所以我无法访问另一个线程上的锁。我是生疏的,所以需要知道最好的方法

例:我在GoLang上也是这样做的

代码语言:javascript
复制
func main() {
    c, _ := net.Dial("tcp", ":1912")
    go io.Copy(os.Stdout, c)
    io.Copy(c, os.Stdin)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-24 14:00:29

使用无性系获取流的第二个副本。

为基础套接字创建一个独立的新句柄。 返回的TcpStream是对此对象引用的相同流的引用。两个句柄将读取和写入相同的数据流,在一个流上设置的选项将传播到另一个流。

然后,您不需要ArcMutex -您可以将第二个副本移动到生成的线程中。

代码语言:javascript
复制
use std::io;
use std::net::TcpStream;
use std::thread;

fn main() {
    let mut stream = TcpStream::connect("localhost:1912").unwrap();
    let mut stream2 = stream.try_clone().expect("could not clone the stream");

    thread::spawn(move || {
        let mut stout = io::stdout();
        io::copy(&mut stream2, &mut stout).expect("error while reading from the stream");
    });

    let mut stdin = io::stdin();
    io::copy(&mut stdin, &mut stream).expect("error while writing to the stream");
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73474382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档