我有一个值,我想在我自己的类型中存储该值以及对该值内部内容的引用:
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)
在每种情况下,我都会收到一个错误,即其中一个值"活不够长".这个错误是什么意思?
Rust标准库中有几种包装类型:
std::cell模块中的单元格:Cell和RefCellRc和Arc.std::sync模块中的类型:Mutex或者AtomicBool例如据我了解,这些是包装器,提供了比简单参考更多的可能性.虽然我理解一些基础知识,但我看不到整体情况.
他们到底做了什么?细胞和参考计数家族是否提供正交或类似的特征?
我有一些关于*nix系统上POSIX Pthreads的读写锁的问题,例如Linux.
我想知道读写锁的默认偏差是什么,即它是否更喜欢读写,反之亦然?它是否提供一些api来更改此默认行为.
posix pthread是否提供了一些api,以便我们可以更改pthread_rwlock_t以防止作者饥饿?从我所读到的(如果我错了请纠正我),默认实现偏向于读者线程,因此作者线程可能面临饥饿.
我已经从David Butenhof的Programming with Posix threads一书中读到了rw锁的示例实现.
我想知道posix pthreads如何处理编写器线程的饥饿?是否有一些api使用,我们可以设置读写锁的属性,以防止写饥饿(我从来没有听说过)?或者用户是否必须处理此问题?
如果您认为答案是实现定义的,那么请举例说明它是如何在Linux中完成的,因为这就是我要找的东西.
请注意,我只想要一个*nix系统的解决方案.不要以为我很粗鲁,但发布一些特定于Windows的代码对我来说毫无用处.
谢谢大家的帮助和耐心:)
我正在学习并发性,并希望澄清我对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左边是一个拥有价值.这里有一个变量阴影.
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)