2015-11-22 16 views
5

Khi chúng tôi đã có một lớp học std::thread thì tại sao chúng tôi yêu cầu không gian tên std::this_thread?std :: thread class vs std :: không gian tên this_thread trong C++?

Sự khác nhau cơ bản giữa chúng là gì?

Khi nào tôi nên sử dụng std::thread lớp học và khi không gian tên std::this_thread?

+4

Nếu chỉ có tài liệu cho những nơi này ... – juanchopanza

+0

Vì vậy, tôi cho rằng bạn đã đọc [tài liệu tham khảo] (http://en.cppreference.com/w/cpp/thread), bạn sẽ thấy nó cơ bản khác với chức năng của 'std :: thread'. Bạn có thể cụ thể hơn không, những gì thực sự không rõ ràng cho bạn. –

Trả lời

5

this_thread các chức năng nhóm không gian tên truy cập chuỗi hiện tại, vì vậy khi chúng ta cần làm điều gì đó trên luồng hiện tại, chúng tôi không cần truy cập đối tượng thread của chuỗi.

Lớp chủ đề không cung cấp quyền truy cập để sinh và ngủ, các chức năng này chỉ có ý nghĩa đối với chuỗi hiện tại và do đó có thể được tìm thấy trong không gian tên this_thread.

Nếu muốn thông tin về một chuỗi khác, chúng ta cần thể hiện thread của chuỗi đó, nếu chúng ta cần truy cập luồng hiện tại, chúng ta luôn có thể thực hiện điều đó thông qua các hàm trong không gian tên this_thread.

Các tư tưởng cho việc sử dụng một không gian tên this_thread cũng đã được giải thích trong bản dự thảo của phần mở rộng:

this_thread Namespace

Lưu ý việc sử dụng không gian tên this_thread để disambiguate khi bạn đang yêu cầu id cho chuỗi hiện tại, so với id của chuỗi con. Tên get_id cho hành động này vẫn giữ nguyên trong việc giảm dấu chân khái niệm của giao diện. Thiết kế này cũng áp dụng cho các chức năng cancellation_requested:

std::thread my_child_thread(f); 
typedef std::thread::id ID: 

ID my_id std::this_thread::get_id(); // The current thread's id 
ID your_id my_child_thread.get_id(); // The child thread's id 

bool have_i_been_canceled = std::this_thread::cancellation_requested(); // Current thread's cancellation status 
bool have_you_been_canceled = my_child_thread.cancellation_requested(); // Child thread's cancellation status 

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2320.html

Thêm chức năng từ this_thread namespace thành viên như tĩnh của lớp thread có thể đã được thực hiện, nhưng sau đó get_id chức năng sẽ phải được gọi là một cái gì đó khác, để làm cho nó rõ ràng khác biệt với chức năng get_id đã tồn tại của lớp chủ đề. Nói cách khác, tôi đoán nhóm C++ đã quyết định thêm các hàm vào một không gian tên riêng biệt để làm rõ hơn rằng các hàm này đang đọc hoặc thao tác chuỗi hiện tại, cái gì đó không được rõ ràng như nhau. thành viên của lớp chuỗi.

2

std::thread được sử dụng để tạo, giám sát và thao tác đề mới,
std::this_thread được sử dụng bên trong đề alreay tạo.

Bạn có thể cung cấp this_thread làm phương pháp tĩnh bên trong lớp công khai bên trong std::thread nhưng đây là một quyết định thiết kế, tôi dám nói rằng kiểu thiết kế này giống Java hơn, nơi đóng gói dữ liệu dưới dạng không gian tên C++ - pilosophy điều chỉnh loại thiết kế.

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