2013-06-26 14 views
0

旗語我有以下代碼:約在linux

int resource; 
sem_t s; 

void function2() 
{ 
    // do some operation to resource 
} 


void function1() 
{ 
    sem_wait(&s); 

    function2(); 

    sem_post(&s); 
} 

如果我們有不同的進程同時調用function1,並function1已經由信號量保護,我們需要有信號保護function2

+0

只有在被'function1'調用時纔不需要。 – VoidPointer

回答

0

由於@VoidPointer在註釋中表示,不需要如果function2不在其他任何地方調用,而是在函數1內部調用。

多數民衆贊成很容易看出原因:你可能認爲函數2被內聯的電話是,對吧?那麼在sem_wait和sem_post之間總是隻有一個進程 - 所以你的數據是安全的。

但是正如@rakib所說,只有在需要時才鎖定數據以避免不必要的等待。

您確定要使用信號量而不是互斥量嗎?見例如:Difference between binary semaphore and mutex

0

從你的代碼我可以說你保護函數調用(函數2())內function1,而不是function1。任何調用引用函數function1都會等待,直到它從function2返回,並且我認爲不需要再次保護函數2,除非在函數2中共享資源。如果在函數2中有共享資源,則需要保護該資源。

1

你真正需要做的是使用信號量來保護你的共享數據。至少這是最好的做法。信號量基本上用於保護可從各種功能訪問的數據。一個典型的應用可能是這樣的:

struct data { 
     yoursharedata; 
     sem_t lock; 
} 

每當你訪問yoursharedata(從任何功能)獲取鎖,處理數據並解除鎖定。像下面這樣:

sem_wait(lock); 
    pock(yoursharedata); 
    sem_post(lock); 

希望這會有所幫助!