达到计数32751后无法创建线程

时间:2018-06-15 06:31:15

标签: c linux pthreads centos7

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

void *my_thread(void *ddd)
{
    printf("Thread created\n");
    pthread_exit(NULL);
}

int main()
{
    int ret = 0, counter = 0;
    pthread_t et;
    while(1)
    {
        ret = pthread_create(&et, NULL, my_thread, (void *)&counter);
        if(ret)
        {
            printf("Ret = %d, errr = %d, couter = %d\n", ret, errno, counter);
            break;
        }
        counter++;
    }
    return 0;
}

以上是我的C代码。检查ulimit -s它给出8192。我没有使用pthred_join,因为我想并行处理我的数据以及完成其工作后将如何退出线程。 创建32750 thred后程序的输出是

Thread created 32750
Thread created 32751
Ret = 11, errr = 12, couter = 32751

1 个答案:

答案 0 :(得分:1)

来自pthread_create man page

  

线程可以是可连接的也可以是分离的。   ...

     

仅当已终止的可连接线程已加入时才是最后一个   资源释放回系统。   ...

     

当分离的线程终止时,其资源会自动释放   回到系统:   ....

     

默认情况下,除非设置了attr,否则将在可连接状态下创建新线程   创建处于分离状态的线程(使用thread_attr_setdetachstate(3))。

这意味着对于您创建但未加入的任何线程,某些资源在终止后仍会保留。 在一定数量的线程之后,你将耗尽资源。

为了避免这种情况,cou可以在创建线程后调用pthread_detach或使用pthread_attr_setdetachstate在创建之前。