首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Rust中访问外部线程本地全局变量?

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

Stack Overflow用户
提问于 2017-02-17 04:45:30
回答 1查看 1.5K关注 0票数 9

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

  • C11
  • gcc的tls推广
  • P螺纹
  • Windows TLS API
EN

回答 1

Stack Overflow用户

发布于 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进行测试)。

代码语言:javascript
复制
#![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();
    }
}

这允许访问声明为下列任一项的变量:

代码语言:javascript
复制
_Thread_local extern int test_global;
extern __local int test_global;

上述锈蚀代码的输出将是:

代码语言:javascript
复制
1
1
1
1
1

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42289590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档