Rust có một tính năng hàng đêm, cho phép liên kết đến các biến bên ngoài chủ đề của địa phương. Tính năng ổn định của tính năng được theo dõi here.
C11/GCC TLS mở rộng
C11 xác định _Thread_local
từ khóa để xác định thread-storage duration cho một đối tượng. Cũng có một bí danh macro thread_local.
GCC cũng triển khai tiện ích mở rộng Thread Local sử dụng từ khóa __thread
làm từ khóa.
Liên kết tới cả một C11 bên ngoài _Thread_local
và gcc __thread
biến là có thể sử dụng hàng đêm (thử nghiệm với rustc 1.17.0-nightly (0e7727795 2017-02-19)
và 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();
}
}
Điều này cho phép có được quyền truy cập vào một biến khai báo là một trong những điều sau đây:
_Thread_local extern int test_global;
extern __local int test_global;
sản lượng của mã Rust trên sẽ là:
1
1
1
1
1
Điều được mong đợi, khi biến được xác định là chuỗi cục bộ.
Bạn có thể bổ sung thư viện và cung cấp chức năng C để đọc và ghi vào các biến thread_local đó không? – kennytm
Có. Đó là ý định của tôi để viết một thư viện keo nhỏ để đối phó với các biến thread-local nếu Rust thiếu các cơ sở cần thiết để làm như vậy. Tuy nhiên, tôi muốn tránh phụ thuộc xây dựng thêm nếu có thể. – Doe
Bất kỳ câu trả lời nào cũng sẽ yêu cầu bạn cho chúng tôi biết ** hệ thống luồng nào bạn đang sử dụng và cách bạn tạo các biến địa phương luồng **. Một cách tuyệt vời để làm điều đó là cung cấp [MCVE] của mã bên ngoài và mã Rust mà bạn đã tạo cho thấy cách bạn muốn truy cập nó. – Shepmaster