2010-05-17 19 views
5

Şu anda bir değişkenin iş parçacığı için güvenli erişim için aşağıdaki kodu kullanıyorum.İş parçacığı güvenlik açığı (erişimci yöntemi)

int gnVariable; 

void getVariableValue(int *pnValue) 
{ 
    acquireLock(); //Acquires the protection mechanism 
    *pnValue = gnVariable; 
    releaseLock(); //Releasing the protection mechanism 
} 
Ben daha kullanıcı dostu benim API imza değiştirmek istiyorum

int getVariableValue(void); 

Ben işlevini yeniden bileyim - API kullanıcıları hakkında rahatsız gerekmez şekilde kilitleme/kilit açma detayları?

+0

Sorunu anlamıyorum. Önerilen API'nizin her iki sürümü de kilitleme ayrıntılarını ortaya çıkarmaz. – zvrba

+0

ikinci versiyona değiştirildiyse - int getVariable (void) -, API kullanıcısı semaforu manuel olarak serbest bırakmak/açmak zorunda kalacaktı. Samuel ve Naveen'in – sonofdelphi

cevap

9

C++ seçeneğini bir seçenek olarak sunduğunuzdan, mutex kilidini/kilidini açabilirsiniz. Daha sonra doğrudan değer döndürebilir:

class lock_wrapper 
{ 
public: 
    lock_wrapper() 
    { 
     acquireLock(); 
    } 
    ~lock_wrapper() 
    { 
     releaseLock(); 
    } 
}; 

int getVariableValue() 
{ 
    lock_wrapper lw; 
    return gnVariable; 
} 

Bu aynı zamanda kullanışlı olacaktır Hiç bir kilitle/yapmak istisna atabilir kod etrafında kilidini gerekiyorsa.

+0

C de aynısını yapmak için herhangi bir fikir? – sonofdelphi

+1

Bunun için Sayım Semaforlarını kullanırdım. Bazı RTOS'larda sayma semaforları atomik olarak çalışan getValue() işlemini destekler. – sonofdelphi

+0

@sonofdelphi - C için, tekniği Naveen'in cevabından kullanmalısınız. –

8

Yerel değişkenin bir kopyasını döndürürsünüz. Bir şey gibi: Bir yan not olarak

int getVariableValue(void) 
{ 
    int local= 0; 
    acquireLock(); 
    local = gnVariable; 
    releaseLock(); 
    return local; 
} 

, bu yerine acquireLock ve releaseLock yöntemleri kilitlemek için RAII prensip daha iyidir.

+0

önerisini yapmazsanız, yerel kopya biraz belirsiz görünüyor. :) Başka gitmek yok mu? – sonofdelphi

+0

@sonofdelphi: @R Samuel Klatchko daha iyi bir çözümdür. Sadece yerel kopya kullanarak nasıl yapılacağını göstermek istedim. – Naveen

+2

@sonofdelphi: Yerel değişken, iyi bir derleyici tarafından en iyi duruma getirilmiş olmalıdır - "gnVariable" ifadesini doğrudan dönüş değeri konumuna kopyalayacaktır. – caf

İlgili konular