2012-01-06 49 views

Trả lời

12

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ểu unique_lock<mutex>, cho phép tối đa hiệu quả trên một số nền tảng. Lớp condition_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.

+0

Cảm ơn. Nó khiến tôi phát điên. Tôi chỉ không thể nhìn thấy nó. –

16

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()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ác vấn đề liên quan