2016-05-31 13 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はい。これにより、正しい数のロックおよびリリースコールがあるかどうかを確認することも容易になります。特別な場合がありますが、これらのコールを分けてはいけませんが、これを避けることをお勧めします。 –

関連する問題