2013-10-05 1 views
0

저는 세마포어를 사용하여 같은 기능을 동시에 처리하는 C 프로젝트를 작업 중입니다. 내가 리눅스에서 루트 사용자로 실행할 때 완벽하게 작동한다. 하지만 다른 사용자가 실행하면 스크립트가 실행되지 않고 세마포 배열에 세마포를 남깁니다. 아무도이 문제에 대한 해결책을 알고 있습니까? 내가 세마포어와 경험이 없기 때문에다른 사용자의 세마포어가 작동하지 않습니다.

int main(int argC, char* argv[]) { 

    pthread_t thr[argC-1]; 
    int indexes[argC-1]; 
    int i,j; 
    for(j=0; j<(argC-1); j++) { 

     indexes[j] = atoi(argv[j+1]); 
     pthread_create (&thr[j], NULL, (int *) &stabtest, (void *) &indexes[j]); 
    } 

    sem_init(&mutex, 0, 1); 

    for(j=0; j<(argC-1); j++) pthread_join(thr[j], NULL); 

    // Destroy semaphore 
    sem_destroy(&mutex); 

    // Exit 
    exit(0); 
} 

int stabtest(void *ptr) { 

    sem_wait(&mutex); // down semaphore 

    // Other code ... 

    sem_post(&mutex); // up semaphore 
    pthread_exit(0); // exit thread 

} 

이 코드는 실제로 인터넷에서 발견

여기 내 코드입니다. 그래서이 코드가 동시에 병렬로 함수를 실행하는 것이 올바른지 확신 할 수 없습니다. 하지만 그것은 루트 사용자를 위해 작동하므로 코드가 더 많거나 적은 것 같습니다.

감사합니다.

답변

0

이 코드가 사용중인 코드라면, 어떤 일이 일어나고 있다고 생각하던간에 일어나는 일은 아닙니다. 사용 권한은 사용중인 세마포어에 영향을 미치지 않아야합니다. 세마포어 배열이 없으며 단일 세마포어를 사용하고 있습니다.

명령 줄 매개 변수가 불안정한 것 같습니다. 문자열에 대한 배열 포인터입니다. argc는 인수의 수입니다. argv [0]은 항상 적어도 하나는 프로그램 이름입니다. argc의 이름을 변경하지 마십시오. 누구나 argc가 무엇인지 압니다. 이름을 변경하면 사람들을 괴롭 히게됩니다.

스레드를 시작하고 다음에 세마포어를 초기화하십시오. 그게 문제 야.

pthread 의 시작 기능은 void* stabtest(void *ptr)을 갖는입니다. 너의 것이 int stabtest(void *ptr)이고 너는 실수에서 벗어나려고 노력하고있어. 그러지 마. 스레드에서 무엇인가를 반환하고 싶다면 pthread_create의 네 번째 파라미터로 사용 된 void ptr을 사용하십시오. 즉, 일부 메모리를 할당하고 pthread_create에 전달한 다음 스레드에서 필요한 정보를 변경하고 스레드에서 동일한 void ptr을 반환합니다. pthread_join을 수행하면 pthread_join에있는 두 번째 매개 변수의 데이터에 대해 반환 된 포인터에 액세스 할 수 있습니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <semaphore.h> 

sem_t mutex; 

void* stabtest(void *ptr) 
{ 
    sem_wait(&mutex); // down semaphore 
    printf("in thread %lu...\n", pthread_self()); 
    sem_post(&mutex); // up semaphore 

    pthread_exit(0); // exit thread 
} 

int main(int argc, char* argv[]) 
{ 
    if (argc != 2) 
    { 
     printf("usage: %s numThread\n", argv[0]); 
     exit(1); 
    } 

    int maxThreads = atoi(argv[1]); 

    pthread_t thr[maxThreads]; 
    int indexes[maxThreads]; 
    int i, j; 

    sem_init(&mutex, 0, 1); 

    for (j = 0; j < maxThreads; j++) 
     pthread_create (&thr[j], NULL, stabtest, NULL); 

    for (j = 0; j < maxThreads; j++) 
     pthread_join(thr[j], NULL); 

    // Destroy semaphore 
    sem_destroy(&mutex); 

    // Exit 
    exit(0); 
} 
관련 문제