pthread_create
を後でリンクするC関数にポイントしたいと思います。そのC関数はpthread_cleanup_push
とpthread_cleanup_pop
を使用します。これはCマクロであり、したがってRustに移植することはできません。安全でない関数をラップせずに安全関数が必要な場合、どのように安全でない関数を渡すことができますか?
これは私のコードです:
extern crate libc;
use std::ptr::null_mut;
use libc::c_void;
extern "C" {
fn thr_fn1(arg:*mut c_void) -> *mut c_void;
}
fn main() {
let mut tid1 = std::mem::zeroed();
libc::pthread_create(&mut tid1, null_mut(), thr_fn1, null_mut());
}
私はとにかくのlibcのFFIを呼んでいることから、私はちょうど、外部C関数を指すことができますが、私はエラーを取得することを期待:
error[E0308]: mismatched types
--> src/bin/11-threads/f05-thread-cleanup.rs:25:49
|
25 | libc::pthread_create(&mut tid1, null_mut(), thr_fn1, null_mut());
| ^^^^^^^ expected normal fn, found unsafe fn
|
= note: expected type `extern "C" fn(*mut libc::c_void) -> *mut libc::c_void`
found type `unsafe extern "C" fn(*mut libc::c_void) -> *mut libc::c_void {thr_fn1}`
ブロックのunsafe{}
ブロックにC関数を呼び出すラッパーを書くことはできますが、それを避ける方法はありますか?
を修正するためにa PR for
libc
を開きました。あなたはそれを書いたと思っていますか、署名を変更するように頼んだことがありますか? – ShepmasterC関数を渡すCコードを呼び出すためにRustコードを使用している場合は、Cコードから 'pthread_create'を呼び出し、すべての曲とダンスをスキップします。 – Shepmaster
安全なコードだけをCに渡すように要求するのは余計に見えますが、単純な回避策は 'extern" Cを作成することです。 "fn wrapped_fn1(arg:* mut c_void) - > * mut c_void {unsafe {thr_fn1(arg)}}' 'wrapped_fn1'を' pthread_create'に渡します。また 'libc :: pthread_create'と' std :: mem :: zeroed'を呼び出すには 'main'に' unsafe'ブロックが必要です。 – user4815162342