gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:44:45 26 4
gpt4 key购买 nike

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

  • C11
  • gcc 的 tls 扩展
  • 多线程
  • Windows TLS API

最佳答案

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

C11/GCC TLS 扩展

C11 定义了 _Thread_local关键字定义 thread-storage duration对于一个对象。还有一个 thread_local宏别名。

GCC 还实现了 Thread Local使用 __thread 作为关键字的扩展。

可以使用 nightly 链接到外部 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

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

关于multithreading - 如何在 Rust 中访问外部线程局部全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42289590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com