运行多个线程时出现C pthread分段错误

时间:2011-09-30 10:45:22

标签: c multithreading pthreads

如果我将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 个答案:

答案 0 :(得分:5)

您不会检查pthread_create是成功还是失败。如果失败,您最终会使用无效的pthread_join来调用pthread_t

答案 1 :(得分:1)

如果你要创建那么多线程,那么你做错了,除非你在超级计算机上。 20世纪90年代的方法是为每个“状态”(连接,任务等)创建一个线程,但当前(和正确的)方法是创建与CPU / Cores(给予或接受)一样多的线程,然后使用异步其余的活动。

答案 2 :(得分:0)

为什么你甚至需要400个线程?您是否意识到拥有大量额外同步的线程会让您的程序变得非常糟糕?

答案 3 :(得分:0)

pthread_mutex_init不会出错!并尝试错误条件