C 在循环中创建线程

C 在循环中创建线程,c,multithreading,gcc,pthreads,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, NUL

像这样在循环中创建线程不好吗

线程函数示例:

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 */
  }

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

创建一次线程并重用它肯定是一个更好的主意,因为线程创建本身会消耗CPU资源。使用这段代码,线程创建将在一段时间后开始失败。原因是,如果我们不加入一个可加入的线程,它最终会成为一个僵尸线程,消耗一些系统资源。因此,我们可以说,通过这段代码,我们在每次迭代中都会泄漏一些系统资源,最终系统将达到一种状态,即它将没有足够的资源来创建线程。通过在“usleep(3000)”语句之前添加对pthread_join的调用,可以避免此问题。

您的代码不正确。虽然可以重复使用
pthread\u 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);
        }
    }
}
#包括
#包括
#定义第10行
void*thread_func(void*args);
int
main()
{
pthread_t threads[n线程];
无效*回收[n次读取];
整数计数;
用于(计数=0;计数
在循环中创建线程没有错,只要记住保留每个唯一的线程标识符(pthread_create的第一个参数),以便以后可以加入线程。也许你应该试着解释一下你的问题?()然后创建一个示例来说明问题并向我们展示。如果您还没有这样做,请。您应该启用编译器警告。函数
thread\u func()
必须返回一个
void*
,如果没有像返回
void
的函数一样返回,它就不能到达最后的
}