2016-05-31 85 views
0

我正在研究一種靜態分析工具,該工具可檢測鎖定/釋放調用信號燈之間是否存在不匹配。該檢測特定於VxWorks RTOS。將信號量作爲參數傳遞給函數

我碰到這個測試用例

void fun(char semid); 
char id,i; 
int main() 
{ 
    id = semCreate();   //initializing a semaphore 
    fun(id); 
    semGive(id);    //semaphore release call 
    return 0; 
} 
void fun(char semid) 
{ 
    semTake(semid);   //semaphore lock call 
    i++;   
} 

來到邏輯上的代碼是有道理的,我們可以對於一個信號量的鎖有一個相應的釋放了,但是這是一個使用信號量的正確方法是什麼?這是一個常規編程練習還是顯然無效?

一些支持或拒絕上面給出的信號量使用的詳細代碼將不勝感激。

回答

1

散射鎖,並呼籲釋放在不同的功能是不好的風格,可能LEED了很多醜陋的調試......

通常你用旗語這樣的:

SEM_ID semId; 

int main() 
{ 
    /* create semaphore */ 
    semId = semCreate(); 
    if (semId != NULL) 
    { 
     /* release semaphore which is initially locked! */ 
     semGive(semId); 
    } 
    else 
    { 
     printf("Failed to create semaphore!\n"); 
     return (ERROR); 
    } 

    [...] 
} 


void someFunction(..) 
{ 
    [...] 

    if (semTake(semId) != ERROR) 
    { 
     /* do something only one thread should do at a time! */ 

     semGive(semId); 
    } /* semTake(semId) */ 

    [...] 
} 

semId也可以通過作爲參數:void someFunction(SEM_ID semId)

+0

因此,基本上正確的用法是鎖定和釋放已作爲參數傳遞的函數本身中的信號量,對嗎? – user3917849

+0

@ user3917849是的。通過這樣做,檢查您是否擁有正確數量的鎖和釋放呼叫也很容易。可能存在特殊情況,您無法分開這些呼叫,但我建議避免這種情況。 –

相關問題