相关疑难解决方法(0)

java.lang.Thread.interrupt()做什么?

你能解释一下java.lang.Thread.interrupt()调用时会发生什么吗?

java multithreading

199
推荐指数
5
解决办法
12万
查看次数

如何处理Rust中的阻塞i/o或一般长时间运行的外部函数调用

我需要通过Rust程序中的posix filedescriptor读取外部进程提供的数据.fd连接保持很长时间(小时),另一方不时将数据传递给我.所以我需要不断地读取和处理数据流.

为此,我编写了一个循环,调用libc::read()(实际上是readv)来读取数据并在收到数据时对其进行处理.由于这会阻塞整个调度程序,因此我在新的调度程序(readv)上生成一个任务.只要它运行,这样就可以正常工作,但我找不到一种干净地关闭循环的方法.

由于循环在大多数时间都是阻塞的,所以我不能使用port/chan来通知循环退出.

我尝试通过使用失败的链接任务将其删除来杀死循环任务(生成监督的循环任务,在其中生成链接任务并等待端口上的信号发生,然后task::spawn_sched(SingleThreaded)用它来取消循环任务) .它在测试中运行良好,但fail!()不会中断(任务在读取完成之前不会失败,并且会libc::read()在某个时间点击.

我学到了很多关于libcore来源的知识,但我似乎找不到合适的解决方案.

  1. 有没有办法在Rust中杀死(子)任务,即使它正在执行一些长时间的外部函数调用,如阻塞读取?
  2. 有没有办法在posix filedescriptor上进行非阻塞读取,以便Rust能够控制任务?
  3. 如果用户终止我的程序,我如何对信号作出反应,例如SIGTERM.task::yield()在Rust中似乎没有类似的东西吗?

io ffi task rust

16
推荐指数
1
解决办法
1819
查看次数

如何从另一个线程终止或暂停Rust线程?

我已经产生了一个带有无限循环和计时器的线程.

thread::spawn(|| {
    let mut timer = Timer::new().unwrap();
    let periodic = timer.periodic(Duration::milliseconds(200));
    loop {
        periodic.recv();

        // Do my work here
    }
});
Run Code Online (Sandbox Code Playgroud)

请注意,虽然此示例是在Rust 1.0之前创建的,并且此后特定类型已更改或已被删除,但一般问题和概念仍然有效

在基于某些条件的时间之后,我需要从程序的另一部分终止该线程.换句话说,我只想退出无限循环.我该怎么做才能正确?另外,我怎么能暂停这个线程并在以后恢复呢?

我试图使用全局不安全标志来打破循环,但我认为这个解决方案看起来不太好.

multithreading rust

13
推荐指数
2
解决办法
7769
查看次数

在将来-rs中封装阻塞I/O的最佳方法是什么?

我阅读了tokio文档,我想知道将来封装昂贵的同步I/O的最佳方法是什么.

使用reactor框架,我们可以获得绿色线程模型的优势:一些OS线程通过执行程序处理大量并发任务.

未来的tokio模型是需求驱动的,这意味着未来本身将轮询其内部状态以提供有关其完成的信息; 允许背压和取消功能.据我了解,未来的投票阶段必须是非阻塞才能运作良好.

I/OI想要封装可以看作是一个长期的原子和昂贵的操作.理想情况下,独立任务将执行I/O,并且相关联的未来将轮询I/O线程以获得完成状态.

我看到的两个唯一选择是:

  • 将阻塞I/O包含poll在将来的功能中.
  • 产生OS线程以执行I/O并使用未来机制轮询其状态,如文档中所示

据我所知,这两种解决方案都不是最优的,并且没有充分利用绿色线程模型(首先不在文档中建议,其次不通过reactor框架提供的执行程序).还有其他解决方案吗?

performance future rust

9
推荐指数
1
解决办法
1699
查看次数

标签 统计

rust ×3

multithreading ×2

ffi ×1

future ×1

io ×1

java ×1

performance ×1

task ×1