【发布时间】:2023-03-13 00:36:01
【问题描述】:
我正在尝试使用指向我的结构的指针调用pthread_join,以便 C 线程可以将结构填充到我指向的内存中。 (是的,我知道这是非常不安全的..)
pthread_join的函数签名:
pub unsafe extern fn pthread_join(native: pthread_t,
value: *mut *mut c_void)
-> c_int
我这样做是为了将 C 代码从一本书移植到 Rust。 C代码:
pthread_t tid1;
struct foo *fp;
err = pthread_create(&tid1, NULL, thr_fn1, NULL);
err = pthread_join(tid1, (void *)&fp);
我想出了这个代码:
extern crate libc;
use libc::{pthread_t, pthread_join};
struct Foo {}
fn main() {
let tid1:pthread_t = std::mem::uninitialized();
let mut fp:Box<Foo> = std::mem::uninitialized();
let value = &mut fp;
pthread_join(tid1, &mut value);
}
但我看到的错误是:
error[E0308]: mismatched types
--> src/bin/11-threads/f04-bogus-pthread-exit.rs:51:24
|
51 | pthread_join(tid1, &mut value);
| ^^^^^^^^^^ expected *-ptr, found mutable reference
|
= note: expected type `*mut *mut libc::c_void`
found type `&mut &mut std::boxed::Box<Foo>`
是否有可能仅使用强制转换来实现这一点,还是我需要转化?
【问题讨论】:
-
我不确定这是否可行,因为它调用了 C lib .. 所以我将它作为评论留下。你可以try letting the compiler infer the types .. but you need to cast the value to a pointer (not a reference)
-
@SimonWhitehead 这行得通!想把它写成答案吗? Matthieu 的答案可能是它应该如何完成(将所有权交给 C 然后收回)但你的答案是一个很好的替代 IMO
-
@SimonWhitehead 你的答案似乎消失了 :(
-
@zack 我最后从来没有把它写成答案!这里的答案很合适:)