对于以下每个线程局部存储实现,如何使用编译器或标准库公开的标准ffi机制在Rust程序中访问外部线程局部变量?
答案 0 :(得分:7)
Rust有一个夜间功能,允许链接到外部线程局部变量。跟踪功能的稳定性here。
C11定义_Thread_local
关键字来定义对象的thread-storage duration。还存在thread_local宏别名。
GCC还实施了Thread Local扩展程序,该扩展程序使用__thread
作为关键字。
每晚都可以使用外部C11 _Thread_local
和gcc __thread
变量进行链接(使用rustc 1.17.0-nightly (0e7727795 2017-02-19)
和gcc 5.4进行测试)
#![feature(thread_local)]
extern crate libc;
use libc::c_int;
#[link(name="test", kind="static")]
extern {
#[thread_local]
static mut test_global: c_int;
}
fn main() {
let mut threads = vec![];
for _ in 0..5 {
let thread = std::thread::spawn(|| {
unsafe {
test_global += 1;
println!("{}", test_global);
test_global += 1;
}
});
threads.push(thread);
}
for thread in threads {
thread.join().unwrap();
}
}
这允许访问声明为以下任一项的变量:
_Thread_local extern int test_global;
extern __local int test_global;
上述Rust代码的输出将是:
1
1
1
1
1
当变量被定义为线程本地时,这是预期的。