在循环中创建线程

时间:2016-02-15 07:41:31

标签: c multithreading gcc pthreads

在循环中创建线程是不是很糟糕?

线程函数示例:

void *thread_func(void* args)
{
  const char *str = (const char *)args;

  printf("Threading %s\n", str);
  usleep(1000);
}

主循环:

pthread_t thread;
while (1) {
    char *str = "test str";
    if (pthread_create(&thread, NULL, thread_func, str)) {
            fprintf(stderr, "Failed to create thread\n");
            return -1;
    }
    usleep(3000);
  /* Thread guaranteed finished here */
  }

或者我必须创建一次并在循环中重用

2 个答案:

答案 0 :(得分:4)

您的代码不正确。虽然可以重新使用pthread_t变量,但您应该加入每个线程。否则,您的系统可能会很快耗尽资源。

在睡眠任何时间后线程“保证已完成”的假设也是不正确的。 (此外,如果你要在主线程上睡觉直到工作线程完成,为什么你首先创建一个单独的线程?)

因此,使 n 线程工作的一般方法是创建 n 线程句柄的数组,为每个线程启动一个线程一,然后做主线程应该做的任何事情,并最终加入所有线程。

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

#define NTHREADS 10

void * thread_func(void * args);

int
main()
{
  pthread_t threads[NTHREADS];
  void * retvals[NTHREADS];
  int count;
  for (count = 0; count < NTHREADS; ++count)
    {
      if (pthread_create(&threads[count], NULL, thread_func, "...") != 0)
        {
          fprintf(stderr, "error: Cannot create thread # %d\n", count);
          break;
        }
    }
  for (int i = 0; i < count; ++i)
    {
      if (pthread_join(threads[i], &retvals[i]) != 0)
        {
          fprintf(stderr, "error: Cannot join thread # %d\n", i);
        }
    }
}

答案 1 :(得分:1)

创建一次线程并重复使用它绝对是一个更好的主意,因为线程创建本身消耗CPU资源。使用这段代码,线程创建将在一段时间后开始失败。原因是,如果我们不加入一个可连接的线程,它最终会成为一个消耗一些系统资源的僵尸线程。所以我们可以说,通过这段代码,我们在每次迭代中泄漏了一些系统资源,最终系统将达到一个状态,即创建一个线程所需的资源不足。通过在&#34; usleep(3000)&#34;之前添加对pthread_join的调用可以避免此问题。言。