첫째, 저는 이탈리아 사람이고 제 나쁜 영어로 유감입니다.
어쨌든, 나는이 연습을해야한다 :
"스레드를 생성하는 프로그램을 작성한다. 메인은 1에서 9까지의 홀수를 보여 주며, 스레드는 2에서 10까지의 짝수를 보여준다. 메인과 스레드를 세마포어는 "
나는이 방법으로 의사 코드를 작성했습니다 :C에서 세마포어가 작동하지 않습니다. 이유가 무엇입니까?
//semaphores
semParent = free
semChild = busy
main
generate thread "child"
for i=1 to 9 step 2
P(semParent)
print i
V(semChild)
end for
end main
child
for i=2 to 10 step 2
P(semChild)
print i
V(semParent)
end child
그리고 이것은 내가 C로 구현 한 방법입니다
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
pthread_mutex_t semParent;
pthread_mutex_t semChild = PTHREAD_MUTEX_INITIALIZER;
void* functionChild (void* arg) {
for(int i=2; i<=10; i+=2) {
pthread_mutex_lock(&semChild);
printf("CHILD: %d\n",i);
pthread_mutex_unlock(&semParent);
}
return NULL;
}
int main(void) {
pthread_t child;
pthread_create(&child, NULL, &functionChild, NULL);
pthread_mutex_init(&semParent, NULL);
for(int i=1; i<=9; i+=2) {
pthread_mutex_lock(&semParent);
printf("PARENT : %d\n",i);
pthread_mutex_unlock(&semChild);
}
pthread_join(child, NULL);
}
그러나 출력은 ALWA입니다 ys는 프로그램을 실행할 때마다 다릅니다.
무엇이 잘못 되었나요?
Windows 10 64 비트에서 CygWin64 터미널을 사용합니다.
미리 감사드립니다.
단조롭게 증가 된 출력 값을 얻으려면 한 스레드에서 다른 스레드로 "반복적으로"스틱을 전달해야합니다. 조건 변수를 찾으십시오. – Sergio
@Serhio 문제가 세마포어를 사용하도록 요청하는 경우 조건 변수를 사용하는 이유는 무엇입니까? 그의 의사 코드는 괜찮습니다. 단지 잘못된 C 변환입니다. –
@PaoloBonzini 뮤텍스는 바이너리 세마포어 (2 개 카운터 값 : 1 또는 0)로 처리되기 때문에 IMO 변환은 상당히 합법적입니다. 뮤텍스는 그러한 능력을 제공하지 않기 때문에 상태 변수는 대기 스레드를 "고정 해제"하는 데 필요합니다. – Sergio