相关疑难解决方法(0)

为什么我不能在同一个结构中存储值和对该值的引用?

我有一个值,我想在我自己的类型中存储该值以及对该值内部内容的引用:

struct Thing {
    count: u32,
}

struct Combined<'a>(Thing, &'a u32);

fn make_combined<'a>() -> Combined<'a> {
    let thing = Thing { count: 42 };

    Combined(thing, &thing.count)
}
Run Code Online (Sandbox Code Playgroud)

有时候,我有一个值,我想在同一个结构中存储该值和对该值的引用:

struct Combined<'a>(Thing, &'a Thing);

fn make_combined<'a>() -> Combined<'a> {
    let thing = Thing::new();

    Combined(thing, &thing)
}
Run Code Online (Sandbox Code Playgroud)

有时,我甚至没有参考该值,我得到同样的错误:

struct Combined<'a>(Parent, Child<'a>);

fn make_combined<'a>() -> Combined<'a> {
    let parent = Parent::new();
    let child = parent.child();

    Combined(parent, child)
}
Run Code Online (Sandbox Code Playgroud)

在每种情况下,我都会收到一个错误,即其中一个值"活不够长".这个错误是什么意思?

lifetime rust borrow-checker

193
推荐指数
3
解决办法
2万
查看次数

需要关于Rust的细胞和参考计数类型的整体解释

Rust标准库中有几种包装类型:

据我了解,这些是包装器,提供了比简单参考更多的可能性.虽然我理解一些基础知识,但我看不到整体情况.

他们到底做了什么?细胞和参考计数家族是否提供正交或类似的特征?

rust

67
推荐指数
2
解决办法
6207
查看次数

如何在pthreads中的读写锁中防止编写器饥饿

我有一些关于*nix系统上POSIX Pthreads的读写锁的问题,例如Linux.

我想知道读写锁的默认偏差是什么,即它是否更喜欢读写,反之亦然?它是否提供一些api来更改此默认行为.

posix pthread是否提供了一些api,以便我们可以更改pthread_rwlock_t以防止作者饥饿?从我所读到的(如果我错了请纠正我),默认实现偏向于读者线程,因此作者线程可能面临饥饿.

我已经从David Butenhof的Programming with Posix threads一书中读到了rw锁的示例实现.

我想知道posix pthreads如何处理编写器线程的饥饿?是否有一些api使用,我们可以设置读写锁的属性,以防止写饥饿(我从来没有听说过)?或者用户是否必须处理此问题?

如果您认为答案是实现定义的,那么请举例说明它是如何在Linux中完成的,因为这就是我要找的东西.

请注意,我只想要一个*nix系统的解决方案.不要以为我很粗鲁,但发布一些特定于Windows的代码对我来说毫无用处.

谢谢大家的帮助和耐心:)

linux multithreading pthreads

29
推荐指数
1
解决办法
2万
查看次数

克隆Arc时会发生什么?

我正在学习并发性,并希望澄清我对Rust书中以下代码示例的理解.如果我错了,请纠正我.

use std::sync::{Arc, Mutex};
use std::thread;
use std::time::Duration;

fn main() {
    let data = Arc::new(Mutex::new(vec![1, 2, 3]));

    for i in 0..3 {
        let data = data.clone();
        thread::spawn(move || {
            let mut data = data.lock().unwrap();
            data[0] += i;
        });
    }

    thread::sleep(Duration::from_millis(50));
}
Run Code Online (Sandbox Code Playgroud)

线路上发生了let data = data.clone()什么?

Rust书说

我们clone()用来创建一个新拥有的句柄.然后将此句柄移动到新线程中.

什么是新的"拥有的手柄"?这听起来像是对数据的引用?

由于clonea &self和a 返回一个Self,是每个线程修改原始数据而不是副本?我猜这就是为什么代码没有使用data.copy()data.clone()在这里.

data右侧是一个参考,而data左边是一个拥有价值.这里有一个变量阴影.

concurrency clone rust

21
推荐指数
3
解决办法
845
查看次数

How to lock a Rust struct the way a struct is locked in Go?

I'm trying to learn how to do locks in Rust the way they work in Go. With Go I can do something like:

type Info struct {
    sync.RWMutex
    height    uint64 
    verify bool
}
Run Code Online (Sandbox Code Playgroud)

If I have some function/method acting on info I can do this:

func (i *Info) DoStuff(myType Data) error {
    i.Lock()
    //do my stuff
}
Run Code Online (Sandbox Code Playgroud)

It seems like what I need is the sync.RWMutex, so this is what I have tried:

pub struct Info {
    pub lock: sync.RWMutex, …
Run Code Online (Sandbox Code Playgroud)

mutex locking rust

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