Tôi có thể thiếu một cái gì đó hiển nhiên, nhưng tôi không thể thấy bất kỳ sự khác biệt nào giữa giữa std::condition_variable
và std::condition_variable_any
. Tại sao chúng ta cần cả hai?Whats sự khác biệt giữa std :: condition_variable và std :: condition_variable_any?
Trả lời
std::condition_variable
chuyên biệt hơn và do đó có thể hiệu quả hơn khi bạn không cần sự linh hoạt của std::condition_variable_any
.
Từ N3290 §30.5 [thread.condition]/1
Lớp
condition_variable
cung cấp một biến điều kiện chỉ có thể chờ đợi vào một đối tượng kiểuunique_lock<mutex>
, cho phép tối đa hiệu quả trên một số nền tảng. Lớpcondition_variable_any
cung cấp biến điều kiện chung mà có thể chờ đối với các loại khóa do người dùng cung cấp.
Trên thực tế, trong libc LLVM của ++, condition_variable_any
được thực hiện bằng cách sử dụng chuyên biệt hơn condition_variable
(trong đó sử dụng pthread_cond_t) trên một shared_mutex.
Sự khác biệt là tham số cho các chức năng wait()
. Tất cả các chức năng chờ trong std::condition_variable
lấy tham số khóa theo loại std::unique_lock<std::mutex>&
, trong khi chức năng chờ cho std::condition_variable_any
là tất cả các mẫu và lấy tham số khóa theo loại Lockable&
, trong đó Lockable
là thông số mẫu.
Điều này có nghĩa là std::condition_variable_any
có thể hoạt động với mutex do người dùng xác định và loại khóa và với những thứ như boost::shared_lock
--- mọi thứ có chức năng lock()
và unlock()
thành viên.
ví dụ:
std::condition_variable_any cond;
boost::shared_mutex m;
void foo() {
boost::shared_lock<boost::shared_mutex> lk(m);
while(!some_condition()) {
cond.wait(lk);
}
}
Xem tài liệu cho việc thực hiện chỉ :: chủ đề của C++ 11 thư viện thread để biết chi tiết:
std::condition_variable
documentation
std::condition_variable_any
documentation
hoặc kiểm tra các latest public draft of the C++11 standard
- 1. sự khác biệt giữa std :: di chuyển và std :: mong
- 2. Sự khác nhau giữa notify_all() và notify_one() của std :: condition_variable là gì?
- 3. Tôi có cần phải đồng bộ hóa std :: condition_variable/condition_variable_any :: notify_one
- 4. Sự khác biệt giữa -std = C++ 11 và -std = gnu ++ 11 là gì?
- 5. Sự khác biệt thực tế giữa std :: nth_element và std :: sort là gì?
- 6. Sự khác biệt giữa std :: function <> và một con trỏ hàm tiêu chuẩn?
- 7. JavaScript: Whats sự khác biệt giữa 'tài liệu' và 'HTML'
- 8. Whats sự khác biệt giữa Keyboard.Focus (mục) và item.Focus()?
- 9. Whats sự khác biệt giữa Exception's. ToString() và .Message?
- 10. Whats sự khác biệt giữa UInt8 và uint8_t
- 11. Whats là sự khác biệt giữa actionbar và tabhost/tabactivity
- 12. Whats sự khác biệt giữa HttpRuntime.Cache và Session?
- 13. Whats là sự khác biệt giữa AutoResetEvent và Mutex
- 14. Whats sự khác biệt giữa persist() và save() trong Hibernate?
- 15. Whats sự khác biệt giữa Run và Do trong Rx?
- 16. Whats sự khác biệt giữa ContentControl.Template và ContentControl.ContentTemplate
- 17. C++ 11 - không thể tỉnh táo một sợi chỉ bằng std :: thread và std :: condition_variable
- 18. Sự khác nhau giữa std :: set và std :: vector là gì?
- 19. Sự khác biệt giữa strstream và stringstream
- 20. Tôi có nên thấy sự khác biệt đáng kể giữa std :: bind và boost :: bind không?
- 21. Sự khác biệt giữa C++ 11 std :: liên kết và tăng :: ràng buộc
- 22. std :: sự khác biệt về bản đồ giữa chỉ mục và các cuộc gọi chèn
- 23. sự khác biệt giữa std :: move và unique_ptr :: reset là gì?
- 24. Sự khác biệt giữa sqrt và sqrtf
- 25. Sự khác biệt giữa char và ký char trong C++?
- 26. sự khác biệt giữa PrintWriter và OutputStream
- 27. Sự khác biệt về std :: vector push_back (Object()) và push_back (new Object())?
- 28. std :: di chuyển giữa std :: string và std :: vector <unsigned char>
- 29. Sự khác biệt giữa $ (...) và `...`
- 30. Sự khác biệt giữa. và #
Cảm ơn. Nó khiến tôi phát điên. Tôi chỉ không thể nhìn thấy nó. –