多次pthread_create调用后,我得到“无法分配内存”错误

时间:2017-06-15 14:05:32

标签: c linux multithreading unix pthreads

我正在使用Posix线程并编写了以下代码,我在其中创建了大量线程,但为此目的重用了pthread_t个变量:

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

// The amount of thread creation iterations
static const int N = 300;

static pthread_t thread_1, thread_2, thread_3;

void * logic_1(void * arg)
{
  usleep(1 * 1000);
  printf("logic_1 end\n");
  return 0;
}

void * logic_2(void * arg)
{
  usleep(1 * 1000);
  printf("logic_2 end\n");
  return 0;
}

void * logic_3(void * arg)
{
  usleep(1 * 1000);
  printf("logic_3 end\n");
  return 0;
}

int main()
{
    int counter = 0;
    int i;
    for(i = 0; i < N; ++i)
    {
        if (pthread_create(&thread_1, NULL, &logic_1, NULL) != 0)
        {
          perror("error: ");
          printf("thread1 did not start after %d threads that were started\n", counter);
          break;
        }
        else
        {
            ++counter;
            printf("start %d thread\n", counter);
        }
        if (pthread_create(&thread_2, NULL, &logic_2, NULL) != 0)
        {
          perror("error: ");
          printf("thread2 did not start after %d threads that were started\n", counter);
          break;
        }
        else
        {
            ++counter;
            printf("start %d thread\n", counter);
        }
        if (pthread_create(&thread_3, NULL, &logic_3, NULL) != 0)
        {
          perror("error: ");
          printf("thread3 did not start after %d threads that were started\n", counter);
          break;
        }
        else
        {
            ++counter;
            printf("start %d thread\n", counter);
        }                      
        usleep(500 * 1000);
    }
    pthread_join(thread_1, NULL);
    pthread_join(thread_2, NULL);
    pthread_join(thread_3, NULL);
    return 0;
}

在执行后我得到了错误:

...
start 376 thread
start 377 thread
start 378 thread
logic_3 end
logic_2 end
logic_1 end
start 379 thread
start 380 thread
start 381 thread
logic_3 end
logic_2 end
logic_1 end
error: : Cannot allocate memory
thread1 did not start after 381 threads that were started

你能告诉我我做错了什么吗?我认为我在linux中遇到了一些界限或限制?在return 0;logic_1logic_2函数中每次调用logic_3语句后,是否会取消分配线程的资源?也许我应该使用一个线程数组,并为这个数组的每个项调用pthread_join函数?

1 个答案:

答案 0 :(得分:1)

您应该在循环内而不是在外部调用pthread_join,以便在下一次迭代中启动新的线程集之前释放已分配的资源 如果您不加入该线程,则根据pthread_join手册页

丢失系统资源
   Failure to join with a thread that is joinable (i.e., one that is not
   detached), produces a "zombie thread".  Avoid doing this, since each
   zombie thread consumes some system resources, and when enough zombie
   threads have accumulated, it will no longer be possible to create new
   threads (or processes).