如何在Rust中访问外部线程局部全局变量?

时间:2017-02-17 04:45:31

标签: multithreading rust ffi

对于以下每个线程局部存储实现,如何使用编译器或标准库公开的标准ffi机制在Rust程序中访问外部线程局部变量?

  • C11
  • gcc&#t; sls extension
  • 并行线程
  • Windows TLS API

1 个答案:

答案 0 :(得分:7)

Rust有一个夜间功能,允许链接到外部线程局部变量。跟踪功能的稳定性here

C11 / GCC TLS扩展

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

当变量被定义为线程本地时,这是预期的。