Сегментация трубы С - PullRequest
       2

Сегментация трубы С

1 голос
/ 26 октября 2011

У меня есть следующий код

    int loopval;
char *message = "D";

//

//KICK OUT THE BAD CALLS
    if(argc != 5)
        terminate("INVALID ARGUEMENTS");
//set arguements
    int num_producers;
        num_producers = atoi(argv[1]);
    int num_consumers;
        num_consumers = atoi(argv[2]);
    int items_per_producer; 
        items_per_producer = atoi(argv[3]);
    int max_in_pipe;
        max_in_pipe = atoi(argv[4]);

    ///set up the pipe
        int fd[2];
        pipe(fd);
    ////



//create producers and consumers arrays
    int producers_return_vals[num_producers];
    pthread_t producers[num_producers];

    int consumers_return_vals[num_consumers];
    pthread_t consumers[num_consumers];

//create producers threads
    for(loopval = 0; loopval < num_producers; loopval++)
    {
        producers_return_vals[loopval] = pthread_create( &producers[loopval], NULL, produce, (void*)message);
    }
//create consumers threads
    for(loopval = 0; loopval < num_consumers; loopval++)
    {
        consumers_return_vals[loopval] = pthread_create( &consumers[loopval], NULL, consume, (void*)message);
    }
//join producers
    for(loopval = 0; loopval < num_consumers; loopval++)
    {
        pthread_join(producers[loopval], NULL);
    }
//join consumers
    for(loopval = 0; loopval < num_producers; loopval++)
    {
        pthread_join(consumers[loopval], NULL);
    }

    exit(0);

Потоки потребителей и производителей теперь одинаковы

    void *consume(void *ptr)
{
    puts("HELLO FROM Consumer");
}

Когда я звоню pipe(fd) Я получаю ошибку сегментации EDIT , когда потоки объединяются * / EDIT *.Может кто-нибудь сказать мне, почему?

Ответы [ 2 ]

1 голос
/ 26 октября 2011

Первое, что нужно проверить, - это возвращаемые значения из вызовов pthread_create, вы сохраняете их, но никогда не проверяете, что потоки действительно были запущены.

Если pthread_create не удастся, то pthread_t будетмусор, который вылетит pthread_join

РЕДАКТИРОВАТЬ:

На самом деле первое, что нужно сделать, это скомпилировать с -Werror -Wall, потому что я не думаю, что вы можете объявлять массивы таким образом.

Предполагается, что это код на C, поэтому переместите все объявления переменных перед всем кодом.Это должно подчеркнуть проблему, которая, вероятно, приводит к поломке - вы не можете разместить массивы переменного размера в стеке таким образом.Если вам нужны массивы переменного размера, вам нужно malloc пространство в куче.

0 голосов
/ 26 октября 2011

Хорошо, проблема не в канале ... НО в фактическом объявлении:

int producers_return_vals[num_producers];
pthread_t producers[num_producers];

Обычно для динамического размещения массивов используется вызов _alloca;Если вызов alloca содержит ошибки (что, как правило, происходит на удивительно большом количестве платформ) или если ваш компилятор не поддерживает динамическое распределение (какую версию компилятора C вы используете?), Тогда вы могли бы запустить SIGSEG ...Убедитесь, что вы используете компилятор, который поддерживает c99, потому что именно там становятся доступны динамические выделения.

...