2013-10-10 2 views
1

문제의 코드는 다음과 같습니다Posix 세마포. sem_wait()에서 내 스레드가 대기하는 이유는 무엇입니까?

void insertIntoFinalArray(char * string) { 
    sem_wait(&insert); 
    if (finalarray == NULL) finalarray = (char **) malloc(sizeof(char *)); 
    else finalarray = (char **) realloc(finalarray, ((size_final + 1) * sizeof(char *))); 

    finalarray[size_final] = (char *) malloc(sizeof(string) + 1); 
    strcpy(finalarray[size_final], string); 
    size_final++; 
    sem_post(&insert); 
} 

삽입 sem_init(&insert, 0, 0); EDIT로 초기화된다 : 이것은 내가 코드 교반했다 sem_init(&insert, 0, 1)을 있어야하는데 그냥 다시 설정하지 않은 ... 그것은 어느 쪽이든 작동하지 않습니다 .

내가 이해하는 것처럼 스레드는 값이 0보다 클 때까지 sem_wait()에서 대기해야합니다. 그러나 디버그 함수에서 여러 스레드를 보여줍니다. ugggg

그래서 세마포어가 무엇인지 이해하지 못하고 있습니까?

편집 : OS X은 이름이없는 세마포어를 지원하지 않습니다 ... 그러나 insert = sem_open("insert", O_CREAT, 1);을 사용해도 모든 스레드가 내 sem_wait() 행을 지나갈 수 있습니다.

+0

을 사용하십시오. 코드의 다른 부분에 아무것도 게시하지 않으므로 아무 것도 시작하지 않기 때문에 절대 사용하지 마십시오. 무슨 디버거가 뭔지? 그것은 IDE에서입니까? – Duck

+0

다른 곳이 없다. http://pastebin.com/Q1Pdi6bw –

+0

값을 0으로 초기화하면, 첫 번째'sem_wait '을 지나치게된다. 뭔가 비린내가 있습니다. 나는 당신의 문제를 보여주는 완벽한 프로그램을 게시하는 것이 좋습니다. – wjl

답변

0

덕을 보내 주셔서 감사합니다.

Apple gcc는 semaphores.h에서 sem_init를 정의하지만 -1을 반환합니다. 구현되지 않았습니다. 즉, 이름없는 세마포를 가질 수 없습니다. 대신 sem_open(name, options, initial value);

관련 문제