2012-02-20 4 views
7

클래스에서 우리는 스레드 작업을 수행하기 위해 세마포어를 사용해야했습니다. (pshared가되는 int * SEM sem_t, 부호 int 값)sem_init (...) : 값 매개 변수는 무엇입니까?

INT의 sem_init; 프로토 sem_init의 (헤더 파일)은 다음과 같다

하지만 변수 값이 무엇을 사용하는지 이해할 수 없습니다. opengroup.org에 따르면

값은

에 세마포어를 설정하는 초기 값은 "값이 값은 ...입니다", 그것은 사용 무슨 도움이됩니다 않습니다 어떻게?

답변

2

sem_init()는 값 (마지막 매개 변수)과 함께 세마포어 (첫 번째 매개 변수)를 초기화하고 마지막으로 이것이 실제로 당신이 묻는 것, int pshared라고 생각할 수 있습니다. pshared == 1이면 세마포어를 분기 할 수 있습니다.

EDIT : 세마포어는 sem_wait (sem_t * sem)과 같은 함수를 사용하여 세마포어를 감소시키기 때문에 int 값을가집니다. 음수이면 차단하십시오. sem_init에서 "값"을 이해하기 위해

+1

"가치있는"이란 무엇을 의미합니까?잠겨 있거나 잠금이 해제되었음을 의미합니까? 세마포어의 가능한 문의 수를 지정합니까? – SomethingSomething

1

(* SEM sem_t은 pshared가 INT, 부호없는 int 값) 나는 우리가 우리가 코드에 세마포어를 사용하는 방법과 동기화 필요가 있다고 생각

: 을 우리가 원하는 경우 세마포어를 기다리려면 sem_wait (& 뮤텍스)를 호출하고 다른 스레드의 sem_wait (& 뮤텍스)을 실행하도록 알리려면 sem_post (& 뮤텍스)를 호출해야합니다. 그러나 문제는 다른 스레드가 처음에 (시스템 초기화에서) sem_post (& 뮤텍스)를 호출하면 sem_wait (& 뮤텍스)에서 수행해야 할 작업은 무엇입니까? 다른 스레드에서 sem_post (& 뮤텍스)를 호출하거나 기다려야합니까? 대답은 sem_init()의 "value"에 있습니다. 이것이 0이면 다른 스레드가 sem_post()를 한 번 호출 할 때까지 기다려야한다는 것을 의미합니다. 하나 인 경우 sem_wait()를 처음 호출하면 즉시 전달되지만 두 번째 sem_wait()는 대기합니다 (sem_post가 호출되지 않은 경우). 그래서 sem_init()의 값은 sem_post()없이 실제로 기다리지 않고 sem_wait()를 실행할 수있는 횟수를 의미합니다. 그리고 우리는 같은 sem_wait() 고려할 수 : 값이 다른 스레드/

동안 (값 < = 0) {}

value--에 의해보다 더 큰 0으로 변경 될 때까지 /교착 상태가 대기를 ;

그리고 같은 sem_post() 고려 :

값을 ++;

0

세마포 값은 스레드간에 공유 할 수있는 공통 리소스 수를 나타냅니다. 값이 0보다 크면 sem_wait를 호출하는 스레드는 기다릴 필요가 없습니다. 값을 1 씩 감소시키고 공통 자원에 액세스합니다. sem_post는 자원을 다시 풀에 추가합니다. 따라서 값을 1 씩 증가시킵니다. 값이 0이면 누군가가 sem_post를 수행 할 때까지 기다립니다.