2015-06-12 21 views
8

Thường thì khi tôi ủy nhiệm công việc cho các chủ đề, tôi có một phần dữ liệu sẽ tồn tại tất cả các chủ đề. Một ví dụ sẽ numbers trong ví dụ sau:Có thể chia sẻ dữ liệu với chủ đề mà không cần sao chép không?

use std::thread; 

fn main() { 
    let numbers = vec![1, 2, 3]; 

    let thread_a = thread::spawn(|| { println!("{}", numbers.len()); }); 
    let thread_b = thread::spawn(|| { println!("{}", numbers.len()); }); 

    thread_a.join().unwrap(); 
    thread_b.join().unwrap(); 
} 

Nó không thay đổi bất cứ nơi nào, và vì join s, nó đảm bảo rằng các chủ đề được sử dụng xong. Tuy nhiên, kiểm tra mượn của Rust không thể nói được.

Các giải pháp mà tôi đã thấy cho đến nay tất cả đều liên quan đến nhân bản đoạn dữ liệu (hoặc nhân bản một dữ liệu Arc). Có thể làm điều đó mà không có bất kỳ nhân bản nào không?

Trả lời

5

No. Nhưng bạn có thể có ý tưởng sai: nhân bản Arc chỉ cần tăng bộ đếm tham chiếu và tạo bản sao con trỏ; nó không thực hiện bất kỳ phân bổ nào. (Sửa: Tất nhiên, đặt một cái gì đó trong một Arc liên quan đến việc phân bổ, nhưng sau đó, bạn đã phân bổ để xây dựng các vec!, vì vậy thêm một phân bổ kích thước cố định là không có khả năng làm tổn thương.)

(Ngẫu nhiên, nếu tất cả các bạn thực sự cần được chiều dài, bạn có thể chỉ tính toán rằng ngoài việc đóng cửa chủ đề và lưu nó trong một biến; một usize không có vấn đề qua một ranh giới chủ đề.)

vấn đề này là, hiện tại, các khoản vay là từ vựng, vì vậy ngay cả nếu nó đã có thể cho trình biên dịch suy ra từ việc sử dụng các join() rằng một chủ đề nhất định được ràng buộc với một đời giới hạn ... nó thậm chí không thử.

một constructor thread::scoped cho phép bạn vượt qua trong tài liệu tham khảo không 'static, nhưng điều đó đã được de-ổn định do vấn đề an toàn bộ nhớ. Có một sự thay thế sắp tới, nhưng (như của Rust 1.0, và có lẽ là 1.1) nó chưa sẵn sàng.

Vì vậy, hiện tại, trong mã an toàn hoặc không phải hàng đêm ... không, bạn không thể.

+1

Vâng, để đặt thứ gì đó trong 'Arc' bạn * làm * thực hiện phân bổ. –

+0

@MatthieuM. Điểm tốt; đã thêm một ghi chú. –

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