2017-02-17 9 views
9

Đối với mỗi lần triển khai lưu trữ cục bộ luồng sau, làm thế nào để một biến cục bộ bên ngoài được truy cập trong các chương trình Rust sử dụng các cơ chế ffi tiêu chuẩn như được trình biên dịch hoặc thư viện chuẩn hiển thị?Biến toàn cầu theo chuỗi địa phương nước ngoài được truy cập trong Rust như thế nào?

  • C11 mở rộng tls
  • gcc của
  • pthreads
  • của Windows TLS API
+2

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

+0

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

+2

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

Trả lời

6

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ộ.

+0

Câu trả lời hay. Vấn đề theo dõi tương ứng có vẻ là https://github.com/rust-lang/rust/issues/29594. Từ vấn đề có vẻ như sự ổn định dường như không có khả năng. – Doe

Các vấn đề liên quan