【问题标题】:C pthread segmentation fault when running many threads运行多个线程时出现 C pthread 分段错误
【发布时间】:2011-09-30 10:45:22
【问题描述】:

如果我将 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);
}

【问题讨论】:

  • 运行命令“ulimit -a”,看看你有没有设置线程数。这表示特定用户可以创建的线程或进程数。

标签: c multithreading pthreads


【解决方案1】:

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

【讨论】:

  • 嗯,这就是您遇到分段错误的原因。您还应该将i 的值传递给线程,而不是指向它的指针。否则,该值可能会在线程读取它时发生变化。
【解决方案2】:

如果你创建了那么多线程,除非你在超级计算机上,否则你就做错了。 1990 年代的方法是为每个“状态”(连接、任务等)创建一个线程,但当前(和正确的)方法是只创建与 CPU/核心(给予或接受)一样多的线程,然后使用异步事件来完成剩下的事情。

【讨论】:

  • 谢谢!我也知道..我只是好奇!
  • +1 指出它已经过时了很多线程:)
【解决方案3】:

为什么你甚至需要 400 个线程?您是否意识到拥有大量额外同步的线程会大大降低您的程序速度?

【讨论】:

  • 我不需要 400 个线程!!我只是在尝试,我很好奇:)
  • 对你有好处!好奇的人是那些在未来犯错更少的人:)
【解决方案4】:

pthread_mutex_init 不会出错!并尝试错误情况

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2013-09-13
    • 2021-08-08
    • 1970-01-01
    • 2018-10-03
    • 2022-10-23
    相关资源
    最近更新 更多