2013-10-05 3 views
0

Я работаю c-проект, который использует семафоры для одновременной обработки одной и той же функции. Когда я запускаю его, на linux, под пользователем root, он работает отлично. Но если я запускаю его на другого пользователя, сценарий не выполняется, и он оставляет семафор в массиве семафоров. Кто-нибудь знает решение этой проблемы?Семафор с другим пользователем не работает

Вот мой код:

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 

} 

Этот код я действительно нашел в Интернете, потому что у меня нет опыта работы с семафорами. Поэтому я не уверен, что этот код является правильным для одновременной работы функции параллельно. Но он работает для пользователя root, поэтому я думаю, что код более или менее ок.

Спасибо!

ответ

0

Если это код, который вы используете, все, что вы думаете, не происходит. Разрешения не должны влиять на семафор, который вы используете. И нет семафорного массива, вы используете один семафор.

У вас, похоже, шаткая хватка в командной строке. Они представляют собой указатели массива на строку. argc - количество аргументов. Всегда будет по крайней мере 1 argv, argv [0], который является именем программы. Не переименуйте argc. Всем известно, что такое argc. Переименование это просто раздражает людей.

Вы начинаете свои темы и затем вы инициализируете свой семафор. Это проблема.

Функция начала работы pthread имеет, чтобы иметь подпись void* stabtest(void *ptr). Yours is int stabtest(void *ptr), и вы пытаетесь выбросить свой путь из-за ошибки. Не делай этого. Если вы хотите что-то вернуть из потока, вы делаете это через пустоту ptr, используемую в качестве 4-го парма в pthread_create. То есть, выделите некоторую память, передайте ее в 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); 
} 
Смежные вопросы