Ошибка сегментации кода при запуске нескольких потоков - PullRequest
2 голосов
/ 30 сентября 2011

Следующий код выполняется без каких-либо проблем, если я сохраняю nThreads меньше 300, но если я, например, введу 400, я получу ошибку сегментации.Я думаю, что это связано с максимальным количеством потоков, но я не уверен, как разрешить больше потоков, или, по крайней мере, как определить максимальное количество потоков, которые я могу запустить.любая идея?заранее спасибо

#include <stdlib.h>
#include <pthread.h>
#include <malloc.h>
#include <unistd.h>

void* thread(void* arg);

int counter=0;
pthread_mutex_t counterMutex = PTHREAD_MUTEX_INITIALIZER;

int main(){
    int nThreads = 0;
    printf("How many threads? ");
    scanf("%d", &nThreads);
    pthread_t* threads = (pthread_t*)malloc(nThreads*sizeof(pthread_t));

    for(int i=0; i < nThreads; i++){
        pthread_create(&threads[i], NULL, thread, (void*)&i);
    }
    for(int i=0; i < nThreads; i++){
       pthread_join(threads[i], NULL);
    }
    printf("counter is %d\n\n", counter);
    exit(0);
}

void* thread(void* arg){
    pthread_mutex_lock(&counterMutex);
    counter++;
    printf("thread %d, counter is %d\n\n", *(int*)arg, counter);
    pthread_mutex_unlock(&counterMutex);
    pthread_exit(NULL);
}

Ответы [ 4 ]

5 голосов
/ 30 сентября 2011

Вы не проверяете, успешно ли pthread_create или нет.Если это не удается, вы звоните pthread_join с недействительным pthread_t.

1 голос
/ 30 сентября 2011

Вы делаете что-то не так, если вы создаете столько потоков, если вы не на суперкомпьютере.Метод 1990-х годов состоял в том, чтобы создать поток для каждого «состояния» (соединение, задача и т. Д.), Но текущий (и правильный) подход состоит в том, чтобы создать только столько потоков, сколько процессоров / ядер (дать или взять), а затем использовать асинхронныйсобытия, чтобы осуществить остальные.

0 голосов
/ 30 сентября 2011

pthread_mutex_init не пойдет не так!И попробуйте для условия ошибки

0 голосов
/ 30 сентября 2011

Зачем вам даже 400 потоков? Понимаете ли вы, что такое огромное количество потоков, которые дополнительно синхронизируются, невероятно замедлит вашу программу?

...