在Rust线程和外部线程同时修改Arc<Mutex<T>>是否安全?

18

有没有一般规则、设计文档或类似的东西,解释了Rust标准库如何处理不是由std::thread生成的线程?

我有一个cdylib包,想以线程方式从另一种语言中使用它:

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

type jlong = usize;
type SharedData = Arc<Mutex<u32>>;

struct Foo {
    data: SharedData,
}

#[no_mangle]
pub fn Java_com_example_Foo_init(shared_data: &SharedData) -> jlong {
    let this = Box::into_raw(Box::new(Foo { data: shared_data.clone() }));
    this as jlong
}

#[cfg(target_pointer_width = "32")]
unsafe fn jlong_to_pointer<T>(val: jlong) -> *mut T {
    mem::transmute::<u32, *mut T>(val as u32)
}

#[cfg(target_pointer_width = "64")]
unsafe fn jlong_to_pointer<T>(val: jlong) -> *mut T {
    mem::transmute::<jlong, *mut T>(val)
}

#[no_mangle]
pub fn Java_com_example_Foo_f(this: jlong) {
    let mut this = unsafe { jlong_to_pointer::<Foo>(this).as_mut().unwrap() };
    let data = this.data.clone();
    let mut data = data.lock().unwrap();
    *data = *data + 5;
}

具体来说,这是关于IT技术的内容。
let shared_data = Arc::new(Mutex::new(5));
let foo = Java_com_example_Foo_init(&shared_data);

如果Java_com_example_Foo_f将从未知的JVM线程调用,那么从thread::spawn生成的线程修改shared_data是否安全?

可能存在的问题。


3
这个问题已经两年了,那里的信息完全过时。 - user395760
1
@Shepmaster,“Rust运行时”不存在,也没有线程本地变量,这意味着std对象(如互斥锁)需要被初始化吗? - fghj
1
你是否不同意delnan在这个问题上的陈述,指出数据过时了?如果是这样,也许你可以提供更多细节来解释为什么你不同意。对于你的队列示例,“项目在哪里,队列在哪里”?这些函数不接受任何参数,因此不能添加任何值,也不能将其添加到任何东西中。 - Shepmaster
1
这个问题严重需要一个 MCVE。 - E net4
1
@Shepmaster:我已经删除了关于Box::into_raw/Box::from_raw的次要问题,这应该可以让这个问题重新回到正轨。我认为询问设计文档类似于在其他语言中请求标准/规范的引用:这是一种寻求更多信息而非仅凭直觉或轶事的方式。 - Matthieu M.
显示剩余6条评论
1个回答

1
是的。您提供的问题与 librustrt 相关,该组件在 Rust 1.0 之前已经被移除。删除 librustrtRFC 230 特别指出:

当将 Rust 代码嵌入其他上下文中(无论是从 C 代码调用还是嵌入到高级语言中),都需要一定量的设置来提供 libstd 所依赖的 "运行时" 基础设施。如果 libstd 绑定到本地线程和 I/O 系统,则嵌入设置会更加简单。

此外,见 PR#19654 实现了该 RFC:

当在嵌入式环境下使用 Rust 时,应该现在可以直接调用 Rust 函数作为 C 函数,而无需进行任何设置,尽管在这种情况下,恐慌将导致进程中止。在这方面,C/Rust 接口看起来很像 C/C++ 接口。

对于当前的文档,请参阅 Rustonomicon FFI 章节 的 Rust 代码示例,以供从 C 调用,其中使用了 libstd(包括 Mutex,我相信这是 println! 的一个实现细节),没有任何与运行时设置相关的警告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接