两个美丽的生锈节目

2020-07-16 17:07:57

这是一个面向有经验的C++开发人员的Rust编程语言的简短广告。作为一个广告,它只会激起您的胃口,请参考其他资源以获得精美的印刷品。

fn main(){let mut xs=vec![1,2,3];let x:&;I32=&;xs[0];xs.ush(92);println!(";{}";,*x);}。

此程序创建一个32位整数的向量(std::Vector<;int32_t>;),引用第一个元素x,再将一个数字压入向量,然后使用x。程序是错误的:扩展向量可能会使对元素的引用无效,而*x可能会取消对悬挂指针的引用。

错误[E0502]:无法将Xs作为可变变量借入,因为它也是作为不可变借入的-->;src/main.rs:4:5 let x:&;I32=&;Xs[0];--此处出现不可变借入xs.ush(92);^可变借入出现在此处println!(X);-稍后在此处使用的不可变借入。

RUST编译器跟踪每段数据的别名状态,并禁止潜在别名数据的突变。在本例中,x和xs别名为堆中向量存储中的第一个整数。

Use CrossBeam::Scope;Use Parking_Lot::{Mutex,MutexGuard};fn main(){let mut counter=Mutex::New(0);Scope(|s|{for_in 0..。10{s.spawn(|_|{for_in 0..。10{let mut Guard:MutexGuard<;I32>;=Counter.lock();*Guard+=1;}});}}).unwire();let Total:&;mut I32=Counter.get_mut();println!(";Total={}";,*total)}。

该程序创建一个受互斥锁保护的整数计数器,派生10个线程,从每个线程开始递增计数器10次,并打印总数。

COUNTER变量驻留在堆栈上,指向这些堆栈数据的指针与其他线程共享。线程必须锁定互斥锁才能进行递增。打印总数时,计数器将绕过互斥锁读取,而不会进行任何同步。

该程序的美妙之处在于,它依赖于几个微妙的推理来保证正确性,每个推理都由编译器进行检查:

子线程不会转义Main函数,因此可以从其堆栈中读取计数器。

当我们在没有互斥锁的情况下读取总计数时,子线程将已经终止。

如果这些约束中的任何一个被打破,编译器就会拒绝代码,不需要使用std::shared_ptr来防御性地确保内存不会在您的脚下释放。

如果你喜欢你所看到的,这里有两本我推荐给你深入了解铁锈的书: