gpt4 book ai didi

multithreading - 如何修改一个线程中的值并使用共享内存读取另一个线程中的值?

转载 作者:行者123 更新时间:2023-11-29 08:08:44 25 4
gpt4 key购买 nike

下面的 Python 代码创建了一个线程(实际上是一个进程),它有一个包含两个传递给它的 float 的数组,线程每 5 秒第一个 float 加 1,第二个 float 加 -1,而主线程是连续打印两个 float :

from multiprocessing import Process, Array
from time import sleep

def target(states):
while True:
states[0] -= 1
states[1] += 1
sleep(5)

def main():
states = Array("d", [0.0, 0.0])
process = Process(target=target, args=(states,))
process.start()
while True:
print(states[0])
print(states[1])

if __name__ == "__main__":
main()

我如何在 Rust 中使用共享内存做同样的事情?我试过执行以下操作(playground):

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

fn main() {
let data = Arc::new(Mutex::new([0.0]));
let data = data.clone();
thread::spawn(move || {
let mut data = data.lock().unwrap();
data[0] = 1.0;
});
print!("{}", data[0]);
}

但这会导致编译错误:

error: cannot index a value of type `std::sync::Arc<std::sync::Mutex<[_; 1]>>`
--> <anon>:12:18
|>
12 |> print!("{}", data[0]);
|> ^^^^^^^

即使那行得通,它也会做一些不同的事情。我读过 this ,但我仍然不知道该怎么做。

最佳答案

您的代码离我们不远了! :)

让我们先看看编译器错误:它说您显然正在尝试索引某些东西。这是真的,你想索引 data变量(带有 data[0] ),但编译器提示您要索引的值的类型为 std::sync::Arc<std::sync::Mutex<[_; 1]>>并且不能被索引。

如果查看类型,您很快就会发现:我的数组仍然包裹在 Mutex<T> 中。包裹在 Arc<T> 中.这给我们带来了解决方案:您也必须锁定读取权限。所以你必须添加 lock().unwrap()就像在另一个线程中一样:

print!("{}", data.lock().unwrap()[0]);

但是现在出现了一个新的编译器错误:use of moved value: `data` .该死!这来自你的名字阴影。你说let data = data.clone();在启动线程之前;这掩盖了原来的 data .那么我们将其替换为 let data_for_thread = data.clone() 怎么样?并使用 data_for_thread在另一个线程?可以看到工作结果here on the playground .


让它做与 Python 示例相同的事情不再那么难了,是吗?

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

let data = Arc::new(Mutex::new([0.0, 0.0]));
let data_for_thread = data.clone();
thread::spawn(move || {
loop {
thread::sleep(Duration::from_secs(5))
let mut data = data_for_thread.lock().unwrap();
data[0] += 1.0;
data[1] -= 1.0;
}
});

loop {
let data = data.lock().unwrap();
println!("{}, {}", data[0], data[1]);
}

可以试试here on the playground ,虽然我改变了一些小东西以允许在 Playground 上运行。

关于multithreading - 如何修改一个线程中的值并使用共享内存读取另一个线程中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39424677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com