multithreading - 如果没有数据等待,从 mpsc::channel 获取数据而不锁定

标签 multithreading asynchronous rust

我正在用 Rust 编写一个小游戏来学习多线程。我得到的代码包含两个循环,一个是逻辑循环,一个是渲染循环,如下所示:

let (t1_entity_in, t1_entity_out) = mpsc::channel(); // ommited type definitions

let (t1_event_in, t1_event_out) = mpsc::channel();

let entity = Entity::new(20,20);

std::thread::spawn(move || {
     let window = Window::new(1280,720);
     loop {
         // waits until parent send data
         let entity = t1_entity_out.recv().unwrap();
         window.draw(entity);
         window.flip();
         let events = window.get_events();
         // parent starts working
     }
});

'event_loop: loop {
    // do stuff to the entity
    t1_entity_in.send(entity.clone());
    // thread 1 starts workinng

    // waits until thread 1 sends data
    let events = t1_event_out.recv().unwrap(); // [1]
    // thread 1 sent data, continues.
    for event in events {
        if event.type == event::QUIT { 
            break 'event_loop;
        }
    }
}

此代码有效,但它的行为方式与单线程几乎相同。我想要的行为是在标记为 [1] 的行中,如果有事件迭代器在等待,请获取它,但如果没有,则只给我一个 None 并继续。我该怎么做?

最佳答案

我想你需要try_recv() :

let events = match t1_event_out.try_recv() {
    Ok(events) => events,
    Err(TryRecvError::Empty) => continue,
    Err(TryRecvError::Disconnected) => break,
};

关于multithreading - 如果没有数据等待,从 mpsc::channel 获取数据而不锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36427347/

相关文章:

c++ - 如何退出 QThread::wait()

rust - 如何从Rust语言的函数返回闭包? [复制]

rust - 为什么 Ord 特征不能使用 cmp 函数为继承特征的所需方法提供默认实现?

segmentation-fault - 在实现两个段错误的类型上从特征 A 转换为特征 B

java - Android:暂停/恢复定时器或线程

multithreading - ThreadPool.QueueUserWorkItem和异步编程

linux - Matlab:-maxNumCompThreads、超线程和 parpool

python - 如何从同步代码 Python 调用异步函数

java - OkHttp 如何在不使用线程的情况下使用看似同步的 HTTP 连接执行并行 HTTP 请求?

matlab - 使用Matlab在后台异步调用系统函数