2011-08-15 18 views
10

Çapraz platform uygulamasında Boost'u kullanmaya başladım, ancak Win32'ın kritik bölümünün veya .Net'in lock davranışını yeniden oluşturmak için kodu nasıl uygulayabildiğimi anlayamıyorum.Boost ile nasıl kritik bir bölüm oluştururum?

Yazma işlemlerini paylaşılan alanlara denetlemek için farklı iş parçacıklarından çağrılabilen bir yöntem Foo yazmak istiyorum. Aynı iş parçacığında yinelenen çağrılara izin verilmelidir (Foo() -> Foo()).

C# bu uygulama çok basit:

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 Boost.Thread kütüphanede bulunan bu sınıflar: Eğer boost :: < lock_guard kullanabilirsiniz boost> sınıf ile

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(); 
     } 
    } 
} 

cevap

11

.

+1

Tavsiyeniz çok faydalıdır. Hatamı düzelttim, ama performans baskısı var! 3 kere daha! = ((bu düzeltmeden önce ben unique_lock kullandı) – Vie

+1

Paylaşılan kaynakları kullanarak kod örnekleri sağlayabilir misiniz? Ayrıca, bu http://home.roadrunner.com/~hinnant/mutexes/locking.html#Shared. faydalı olacaktır –

+1

Yinelemeli kilitlemeyi kullanmaktan kaçınmaya çalışın, muhafazayı dış alana taşıyarak olabilir Tekrarlayan muteksler daha basit ve basit olabilir. – blaze

3

Boost'u kullanarak örneğinizin yeniden yazılması.Thread: Yorumları kaldırdım, ancak aksi halde 1'e 1 yeniden yazılmalıdır.

boost::recursive_mutex mtx; 

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

Dökümantasyon here bulunabilir.

Boost'un bir dizi farklı muteks türünü tanımladığını unutmayın. Örneğiniz, yinelemeli olarak alınan kilidi gösterdiğinden, en az boost::recursive_mutex kullanmamız gerekiyor.

Farklı türde kilitler de vardır. Özellikle, bir okuyucu-yazar kilidini (böylece, yazarın kilidi olmadığı sürece, birden fazla okuyucu kilidi aynı anda tutabilsin) 'u lock_guard yerine kullanabilirsiniz.