当前位置: 首页 > 知识库问答 >
问题:

rust - 大佬帮忙Go 语言并发读写代码的用Rust 实现?

师腾
2024-01-18

请大佬帮忙把一段之前golang实现的并发读写代码用rust实现

package mainimport (    "fmt"    "sync"    "time")type Rule struct {    Id    int64    Words []string}type Repo struct {    Version int64    rwLock  sync.RWMutex    Rules   []*Rule}func main() {    r0 := Rule{        Id:    0,        Words: []string{"a", "b", "c"},    }    r1 := Rule{        Id:    1,        Words: []string{"0", "1", "2"},    }    repo := Repo{        Version: 0,        Rules: []*Rule{            &r0,            &r1,        },    }    var wg sync.WaitGroup    wg.Add(2)    go func() {        repo.rwLock.RLock()        rs := repo.Rules        repo.rwLock.RUnlock()        time.Sleep(2 * time.Second)        for i := range rs {            fmt.Println(rs[i].Id)        }        wg.Done()    }()    go func() {        time.Sleep(1 * time.Second)        repo.rwLock.Lock()        repo.Rules[1].Id = 999        repo.Rules = repo.Rules[0:1]        repo.Rules[0].Id = 1000        repo.rwLock.Unlock()        wg.Done()    }()    wg.Wait()}

共有1个答案

孙池暝
2024-01-18
use std::sync::{Arc, Mutex};use std::thread;use std::time::Duration;struct Rule {    id: i64,    words: Vec<String>,}struct Repo {    version: i64,    rules: Vec<Arc<Mutex<Rule>>>,}fn main() {    let r0 = Arc::new(Mutex::new(Rule {        id: 0,        words: vec!["a".to_string(), "b".to_string(), "c".to_string()],    }));    let r1 = Arc::new(Mutex::new(Rule {        id: 1,        words: vec!["0".to_string(), "1".to_string(), "2".to_string()],    }));    let repo = Arc::new(Repo {        version: 0,        rules: vec![r0, r1],    });    let mut handles = Vec::new();    let repo_for_read = Arc::clone(&repo);    let handle1 = thread::spawn(move || {        let repo = repo_for_read;        let rs = repo.rules.clone();        thread::sleep(Duration::from_secs(2));        for r in rs.iter() {            println!("{}", r.lock().unwrap().id);        }    });    handles.push(handle1);    let repo_for_write = Arc::clone(&repo);    let handle2 = thread::spawn(move || {        thread::sleep(Duration::from_secs(1));        let mut rules = repo_for_write.rules.clone();        if let Some(r) = rules.get_mut(1) {            let mut r = r.lock().unwrap();            r.id = 999;        }        rules.remove(1);        if let Some(r) = rules.get_mut(0) {            let mut r = r.lock().unwrap();            r.id = 1000;        }    });    handles.push(handle2);    for handle in handles {        handle.join().unwrap();    }}
 类似资料:
  • 我想写一个模拟 DNF 装备增幅的程序,通过多次样本执行得到平均每件增幅 10 装备需要增幅多少次。装备 +4 之前不会失败,+4 之后会失败且失败后还会掉级,具体如下图所示: 公会秘药和普雷宠物会额外增加每次增幅的成功率 1% 和 4%,所以一共分了三种情况。 我最开始用 js 写了一版: 后来想到我刚学了 rust,不如练练手,而且 rust 很快,于是又写了一版: 然而实际上 rust 代码

  • 我们知道,Node.js 不适合 CPU 密集型计算的场景,通常的解决方法是用 C/C++ 编写 Node.js 的扩展(Addons)。以前只能用 C/C++,现在我们有了新的选择——Rust。 3.5.1 环境 node@8.9.4 rust@1.26.0-nightly 3.5.2 Rust Rust 是 Mozilla 开发的注重安全、性能和并发的现代编程语言。相比较于其他常见的编程语言,

  • 这本书将教会你使用Rust 编程语言。Rust 是一个系统编程语言,它注重于三个方面:安全,速度和并发性。为了实现这些目标,它没有采用垃圾回收机制(GC)。这让它在其它语言并不擅长的场景中大展身手:嵌入到其它语言中、在特定的时间和空间要求下编程、编写例如设备驱动和操作系统这样的底层代码。

  • Rust 语言是一种高效、可靠的通用高级语言。其高效不仅限于开发效率,它的执行效率也是令人称赞的,是一种少有的兼顾开发效率和执行效率的语言。

  • 算法(Rust语言描述)       这是一本开源的算法书,在遵守许可协议的前提下您可以自由的使用、翻译、印刷、出版本书。在遵守许可协议的前提下您也可以将这本书商业化。 如果您想加入本书的编撰,您可以联系本书的发起者yevgenyliu@yahoo.com

  • 新手写了一个晚上没写出来, 各种报错, baidu google 翻遍了, 求帮忙写个参考一下。 有一个向量 let data: Vec<i32> = (0..50).collect(); 需要开三个thread来修改data 每个thread获取data的4个元素, 原地修改元素 // 0, 1, 2, 3 -> 1, 2, 3, 4 1号thread +1 // 4, 5, 6, 7 -> 6