2016-08-02 2 views
1


첫째, 저는 이탈리아 사람이고 제 나쁜 영어로 유감입니다.
어쨌든, 나는이 연습을해야한다 :
"스레드를 생성하는 프로그램을 작성한다. 메인은 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 터미널을 사용합니다.
미리 감사드립니다.

+0

단조롭게 증가 된 출력 값을 얻으려면 한 스레드에서 다른 스레드로 "반복적으로"스틱을 전달해야합니다. 조건 변수를 찾으십시오. – Sergio

+0

@Serhio 문제가 세마포어를 사용하도록 요청하는 경우 조건 변수를 사용하는 이유는 무엇입니까? 그의 의사 코드는 괜찮습니다. 단지 잘못된 C 변환입니다. –

+0

@PaoloBonzini 뮤텍스는 바이너리 세마포어 (2 개 카운터 값 : 1 또는 0)로 처리되기 때문에 IMO 변환은 상당히 합법적입니다. 뮤텍스는 그러한 능력을 제공하지 않기 때문에 상태 변수는 대기 스레드를 "고정 해제"하는 데 필요합니다. – Sergio

답변

-1

NULL 속성을 가진 pthread_mutex_init(&semParent, NULL)PTHREAD_MUTEX_INITIALIZER은 같은 효과를 가지고 있다고 생각합니다. 두 가지 모두 잠금이 해제 된 상태로 초기화됩니다. 귀하의 문제는 엄격한 의미의 중요한 섹션을 가지고 있지는 않습니다. 그래서 더 나은 해결책은 @Serhio가 언급 한 바와 같이 조건 변수가 될 수 있습니다. 더 큰 자유를 주며 mutex의 기능을 가질 수있는 세마포어 http://www.csc.villanova.edu/~mdamian/threads/posixsem.html을 확인할 수도 있습니다.

1

pthread_mutex_t은 세마포어가 아닙니다 (세마포어는 "자유"로 초기화하기 위해 "V"를 할 경우 뮤텍스로 사용할 수 있지만). 세마포어 API는 sem_init, sem_postsem_wait입니다.

다른 스레드에 의해 잠긴 뮤텍스에 pthread_mutex_unlock을 사용하면 프로그램에서 정의되지 않은 동작을 트리거합니다.

+0

'sem _ *()'패밀리는 pthread API가 아니며 프로세스 간 통신을 위해 설계되었습니다. – Sergio

+0

@Serhio [semaphore.h'에서 제공되는] 함수들 (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/semaphore.h.html)은 내부와 * 내부 프로세스 통신을 위해 설계되었습니다. , [문서] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_init.html). 그들은 여기에서 사용하기에 아주 적절합니다. –

+0

@AndrewHenle 오, 내 잘못입니다. 감사! – Sergio

0

이것은 현재 발생하는 문제의 원인이 아니지만 다중 스레드 프로그램에서 printf()를 사용하면 안됩니다. printf()는 버퍼에 쓰고 항상 화면에 즉시 인쇄하지는 않습니다. 대신 sprintf()를 사용하여 다음을 작성해야합니다.