c - POSIX pthread_join 在数千个线程后挂起

标签 c pthreads posix pthread-join

我是 POSIX 的新手,我找不到解决这个特定问题的方法。

在具有大量迭代(>100000)的循环内创建 pthread 是否存在任何已知问题?

似乎每次我执行时,它都卡在一个随机的 pthread_join 上。

  • 我已经用 valgrind 测试了内存泄漏和线程栈的使用情况。
  • 如果我在程序挂起时中断 gdb,它将跟踪问题到 pthread_join

这是重现我的问题的示例代码。

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>

    void* task(void* args);
    int main(int argc, char **argv)
    {
        int num_threads = 4;
        int m = 100000;
        int i;
        for(i = 0; i < m; i++)
        {
            fprintf(stdout, "i:%d\n",i);
            //parallel region starts
                pthread_t threads[num_threads];
                int t,rc;

                for(t = 0; t < num_threads; t++)
                {
                    rc = pthread_create(&threads[t],NULL,task,NULL);
                    if(rc){
                        fprintf(stderr,"ERROR; return code from pthread_create() is %d\n", rc);
                        exit(-1);
                    }
                }
                for(t = 0; t < num_threads; t++)
                {
                    rc = pthread_join(threads[t],NULL);
                    if(rc){
                    fprintf(stderr,"ERROR; return code from pthread_join() is %d\n", rc);
                        exit(-1);
                    }
                }
            //parallel region ends
        }
        pthread_exit(NULL);
    }

    //thread task
    void* task(void* args)
    {
        pthread_exit(NULL);
    }

最佳答案

在 Ubuntu 机器 i7-4600U CPU @ 2.10GHz 上验证了你的代码 我没有发现您的代码有任何问题,只是为了验证我在本地计算机上编译和运行您的代码似乎工作正常。

我得到了预期的输出:

i:999,j:999

所以我假设您遇到的问题与您的环境有关。您使用的是什么 CPU 操作系统和 GCC?

关于c - POSIX pthread_join 在数千个线程后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49511499/

相关文章:

C: strtof 单位转换错误

c - 不知道为什么字符数组的成员在 C 中不能正确打印

c - 我应该如何使用 FIFO 等待子进程的输入

c - 线程与其父栈之间的关系是什么?

c - fork() 阻塞父进程

python - 打印或写入 stdout 时出现 BlockingIOError

c - c中的单链表

c - 用C模拟javascript的setTimeout和setInterval

c - 访问区域设置信息

c - 为什么这段代码不运行?