2016-05-31 5 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 예. 이렇게하면 잠금 및 릴리스 호출 수가 올 Y 른지를 쉽게 확인할 수 있습니다. 이러한 호출을 별도로 구분하지 않는 특수한 경우가있을 수 있지만이를 피하는 것이 좋습니다. –

관련 문제