对于以下每个线程本地存储实现,如何使用编译器或标准库公开的标准ffi机制在Rust程序中访问外部线程局部变量?
发布于 2017-02-20 13:41:55
锈蚀具有夜间特性,允许链接到外部线程局部变量。该特性的稳定性被跟踪这里。
C11 / GCC TLS扩展
C11定义_Thread_local关键字来定义对象的线程存储持续时间。还有一个本地宏别名。
GCC还实现了一个线程局部扩展,它使用__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;上述锈蚀代码的输出将是:
1
1
1
1
1当变量定义为线程本地时,这是预期的。
https://stackoverflow.com/questions/42289590
复制相似问题