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
Cảm ơn. Nó khiến tôi phát điên. Tôi chỉ không thể nhìn thấy nó. –