有没有一般规则、设计文档或类似的东西,解释了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
是否安全?
Box::into_raw
/Box::from_raw
的次要问题,这应该可以让这个问题重新回到正轨。我认为询问设计文档类似于在其他语言中请求标准/规范的引用:这是一种寻求更多信息而非仅凭直觉或轶事的方式。 - Matthieu M.