2011-08-15 14 views
10

Đối với ứng dụng đa nền tảng của tôi, tôi đã bắt đầu sử dụng Boost, nhưng tôi không thể hiểu làm thế nào tôi có thể thực hiện mã để tái tạo hành vi của phần quan trọng của Win32 hoặc .Net của lock.Làm cách nào để tạo một phần quan trọng với Boost?

Tôi muốn viết một phương thức Foo có thể được gọi từ các luồng khác nhau để kiểm soát hoạt động ghi vào các trường được chia sẻ. Các cuộc gọi đệ quy trong cùng một chuỗi sẽ được cho phép (Foo() -> Foo()).

Trong C# thực hiện điều này rất đơn giản:

object _synch = new object(); 
void Foo() 
{ 
    lock (_synch) // one thread can't be lock by him self, but another threads must wait untill 
    { 
     // do some works 
     if (...) 
     { 
      Foo(); 
     } 
    } 
} 

Trả lời

11

Với thúc đẩy bạn có thể sử dụng tăng :: lock_guard <> lớp:

class test 
{ 
public: 
void testMethod() 
{ 
    // this section is not locked 
    { 
    boost::lock_guard<boost::recursive_mutex> lock(m_guard); 
    // this section is locked 
    } 
    // this section is not locked 
} 
private: 
    boost::recursive_mutex m_guard; 
}; 

PS Những lớp học nằm ở Boost.Thread thư viện.

+1

Đề xuất của bạn rất hữu ích. Tôi đã sửa lỗi của mình, NHƯNG tôi có sự đàn áp hiệu suất! nhiều hơn thì 3 lần! = ((trước khi sửa chữa tôi đã sử dụng unique_lock ) – Vie

+1

Bạn có thể cung cấp các mẫu mã nơi bạn sử dụng tài nguyên được chia sẻ không? Ngoài ra, hãy kiểm tra http://home.roadrunner.com/~hinnant/mutexes/locking.html#Shared này. –

+1

Cố gắng tránh sử dụng khóa đệ quy, có thể bằng cách di chuyển bảo vệ đến phạm vi bên ngoài. – blaze

3

Dưới đây là một ghi đè ví dụ của bạn, sử dụng Boost.Thread: Tôi đã xóa các nhận xét, nhưng nếu không, nó phải là viết lại từ 1 đến 1.

boost::recursive_mutex mtx; 

void Foo() 
{ 
    boost::lock_guard<boost::recursive_mutex> lock(mtx); 
    if (...) 
    { 
     Foo(); 
    } 
} 

Tài liệu có thể được tìm thấy here.

Lưu ý rằng Boost xác định một số loại mutex khác nhau. Vì ví dụ của bạn cho thấy khóa đang được thực hiện đệ quy, chúng tôi cần sử dụng ít nhất boost::recursive_mutex.

Ngoài ra còn có các loại khóa khác nhau. Đặc biệt, nếu bạn muốn khóa người đọc đọc (để nhiều người đọc có thể giữ khóa đồng thời, miễn là không có người viết nào có khóa), bạn có thể sử dụng boost::shared_lock thay vì lock_guard.

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