2012-02-29 27 views
12

Tôi hiểu rằng biến bị khóa bởi boost::mutex::scoped_lock được tự động mở khóa khi nó nằm ngoài phạm vi.Tăng Boost của Chủ đề :: unique_lock một khóa scoped?

Làm thế nào về boost::unique_lock, nó có tự động mở khóa biến khi nằm ngoài phạm vi không?

Bất kỳ ai cũng có thể trỏ tham chiếu cho đối tượng địa lý đó.

double x; 
boost::mutex x_mutex; 

void foo() 
{ 
    { 
     boost::unique_lock<boost::mutex> lock(x_mutex); 
     x = rand(); 
    }  
    ...... some calculation which takes 10 second ...... 
    ...... is x still locked here??? ......  
} 

Cảm ơn.

+1

Vâng, đúng vậy. Tài liệu có tại đây: http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html#thread.synchronization.locks.unique_lock –

+1

Nếu trình phá hủy không mở khóa, khi nào nó có bao giờ được mở khóa? –

+0

Đường vòng khác của nó. 'boost :: mutex :: scoped_lock' là một typedef của' unique_lock'. http://www.boost.org/doc/libs/1_57_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_types.mutex – balki

Trả lời

12

scoped_lockunique_lock. Trong mutex.hpp:

typedef unique_lock<mutex> scoped_lock; 

Destructor gọi unlock() nếu khóa đã được mua lại. Vì vậy, nó sẽ phát hành khi nó đi ra khỏi phạm vi.

Xem http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html

không chỉ có khả năng cung cấp cho RAII kiểu khóa, nó cũng cho phép trì hoãn việc mua khóa cho đến khi chức năng thành viên khóa() được gọi một cách rõ ràng, hoặc cố gắng để có được các khóa trong một thời trang không bị chặn hoặc hết thời gian chờ. Do đó, mở khóa() chỉ được gọi trong destructor nếu đối tượng khóa đã khóa đối tượng Lockable, hoặc nếu không được thông qua một khóa trên đối tượng Lockable.

+0

Cảm ơn bạn đã trả lời. Nếu một tăng :: unique_lock được tự động mở khóa khi nó đi ra khỏi phạm vi, thì sự khác biệt giữa tăng :: unique_lock và boost :: mutex :: scoped_lock là gì? Cảm ơn. – 2607

+0

Ngoài ra cảm ơn bạn đã chỉ ra các tài liệu tham khảo, nhưng tôi là một chút nhầm lẫn ở đây, không có nghĩa là destructor được tự động gọi là khi nó nằm ngoài phạm vi? – 2607

+5

'scoped_lock' là một typedef cho' unique_lock '. các vars tự động được khai báo trong một khối {} sẽ bị hủy khi kết thúc của khối được thực hiện làm cho [mẫu RAII] (http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization) có thể. – jspcal

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