2017-08-22 31 views
6

Lines từ Anthony Williams cuốn sách:std :: di chuyển hoạt động C++

Ví dụ sau đây cho thấy việc sử dụng std :: di chuyển để chuyển quyền sở hữu của một đối tượng động vào một sợi:

void process_big_object(std::unique_ptr<big_object>); 

std::unique_ptr<big_object> p(new big_object); 
p->prepare_data(42); 
std::thread t(process_big_object,std::move(p)); 

Bằng cách chỉ định std::move(p) trong hàm tạo std::thread, quyền sở hữu của big_object được chuyển trước tiên vào nội bộ bộ nhớ cho mới đã tạo chuỗi và sau đó nhập vào process_big_object.

Tôi hiểu chồng và đống; bất kỳ ý tưởng nào, đây thực sự là bộ nhớ trong nội bộ?

Tại sao họ không thể chuyển quyền sở hữu trực tiếp đến process_big_object?

+3

mỗi luồng có ngăn xếp riêng. Đối tượng thread cần trước tiên yêu cầu tạo ngăn xếp của riêng nó và các tài nguyên hệ điều hành khác trước khi nó có thể gọi hàm của bạn với ngăn xếp của chính nó làm cơ sở. Vì vậy, nó cần lưu trữ dữ liệu ở đâu đó trước khi gửi đến chức năng của bạn. – PeterT

+0

cảm ơn, @PeterT. đã trả lời phần cuối của ques của tôi. –

Trả lời

11

Điều đó có nghĩa là đối tượng sẽ tạm thời thuộc về đối tượng std::thread cho đến khi luồng thực sự bắt đầu.

Bộ nhớ trong ở đây đề cập đến bộ nhớ được liên kết với đối tượng std::thread. Nó có thể là một biến thành viên, hoặc chỉ được giữ trong ngăn xếp trong quá trình khởi tạo. Vì điều này phụ thuộc vào việc triển khai thực hiện, nên sử dụng thuật ngữ chung "không gian lưu trữ nội bộ" và "không lưu trữ".

+0

Cả hai câu trả lời đều tốt. Chấp nhận điều này cho dòng cuối cùng. –

9

Tất cả các đối số cho một luồng được sao chép vào một số bộ nhớ trong được giữ bởi đối tượng std::thread, vì vậy nó có thể được chuyển đến hàm chuỗi.

Bộ nhớ trong đó thuộc sở hữu của đối tượng std::thread, trước khi quyền sở hữu được chuyển sang chức năng chuỗi thực tế.

0

Tại sao họ không thể chuyển quyền sở hữu trực tiếp đến process_big_object?

Vì không có dòng nào trong đoạn mã nơi process_big_object được gọi là hàm. Dòng cuối cùng của đoạn mã gọi hàm tạo std::thread. Nó sẽ thiết lập chuyển động một chuỗi các sự kiện mà cuối cùng sẽ gây ra process_big_object(p) để được gọi trong chủ đề mới; nhưng cuộc gọi đó không hiển thị ở đây.

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