2010-10-04 21 views
15

Tôi có câu hỏi liên quan đến việc sử dụng boost::lock_guard (hoặc các ổ khóa có phạm vi tương tự) và sử dụng các biến cần khóa bảo vệ trong tuyên bố return.Cách sử dụng lock_guard khi trả lại dữ liệu được bảo vệ

Làm cách nào để hủy các đối tượng địa phương và sao chép giá trị trả lại? Tối ưu hóa giá trị trả lại ảnh hưởng đến điều này như thế nào?

Ví dụ:

Data Class::GetData() 
{ 
    boost::lock_guard<boost::mutex> lock(this->mMutex); 
    return this->mData; 
} 

Điều này có thể đúng (nếu mData là biến bảo vệ bởi mMutex)? Hoặc tôi có phải sử dụng phạm vi địa phương và giống như tạm thời được hiển thị trong ví dụ bên dưới:

Data Class::GetData() 
{ 
    Data ret; 
    { 
     boost::lock_guard<boost::mutex> lock(this->mMutex); 
     ret = this->mData; 
    } 
    return ret; 
} 

Trả lời

18

Chỉ cần quay lại thẳng như trong ví dụ đầu tiên của bạn là chính xác. Giá trị trả về được tạo trước khi các biến cục bộ bị hủy và do đó trước khi khóa được giải phóng.

0

Cả hai phần đều tương đương nhau. Trong thực tế đối với trường hợp # 1 - trình biên dịch C++ sẽ tạo ra cấu trúc được mô tả trong trường hợp # 2. Vì vậy, # 1 là thích hợp hơn.

3

Làm cách nào để hủy các đối tượng địa phương và sao chép giá trị trả lại?

Nói chung, các đối tượng ngăn xếp bị hủy theo thứ tự ngược lại. Như đã nói ở trên, cả hai cách tiếp cận bạn chỉ định sẽ cung cấp hành vi mong muốn.

Tối ưu hóa giá trị trả lại ảnh hưởng đến điều này như thế nào?

RVO không phải là mối quan tâm ở đây - tất cả điều này là xây dựng đối tượng đầu ra trực tiếp vào bộ đệm khung ngăn xếp - tránh chi phí tạo đối tượng tạm thời được đặt tên (như trong ví dụ thứ 2 ở trên). Điều này được thực hiện trước khi các hàm hủy cục bộ được gọi.

Bạn nên sử dụng mã từ ví dụ 1 ở trên.

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