Multithreading pthread_create()不创建线程

Multithreading pthread_create()不创建线程,multithreading,pthreads,Multithreading,Pthreads,我正在处理一个多线程程序,但由于某些原因,我无法创建线程。当我尝试调试时,它在pthread_join语句处中断 for (i = 0; i < numThreads; ++i) { pthread_create (&(tids[i]), &attr, runnerFunction, &sValue[i]); } join语句只是 for (i = 0; i < numThreads; ++i) { pthread_join (tids[i],

我正在处理一个多线程程序,但由于某些原因,我无法创建线程。当我尝试调试时,它在pthread_join语句处中断

for (i = 0; i < numThreads; ++i)
{ 
  pthread_create (&(tids[i]), &attr, runnerFunction, &sValue[i]);
}
join语句只是

for (i = 0; i < numThreads; ++i)
{
    pthread_join (tids[i], NULL);
}
有人有什么建议吗?

在我的机器上使用11,pthread\u attr\t的定义如下:

typedef union
{
  char __size[__SIZEOF_PTHREAD_ATTR_T];
  long int __align;
} pthread_attr_t;
for (i = 0; i < numThreads; ++i)
{ 
  int result = pthread_create (&(tids[i]), &attr, runnerFunction, &sValue[i]);
  if (0 != result)
  {
    fprintf(stderr, ("pthread_create() failed with error #%d: '%s'\n", result, strerror(result));
    exit(EXIT_FAILURE);
  }
}
属性类型的结构不是故意公开的。我猜您只是声明了一个本地pthread_attr_t对象,而没有调用pthread_attr_initpthread_attr_t*attr,它用默认属性值初始化attr指向的线程属性对象。为了不定义结构中char arry的值,在创建POSIX线程时使用了未初始化的pthread_attr_t对象。如果将NULL作为pthread_create的attr参数传递,则会使用默认属性创建线程

在我的机器上使用11,pthread\u attr\t的定义如下:

typedef union
{
  char __size[__SIZEOF_PTHREAD_ATTR_T];
  long int __align;
} pthread_attr_t;
for (i = 0; i < numThreads; ++i)
{ 
  int result = pthread_create (&(tids[i]), &attr, runnerFunction, &sValue[i]);
  if (0 != result)
  {
    fprintf(stderr, ("pthread_create() failed with error #%d: '%s'\n", result, strerror(result));
    exit(EXIT_FAILURE);
  }
}

属性类型的结构不是故意公开的。我猜您只是声明了一个本地pthread_attr_t对象,而没有调用pthread_attr_initpthread_attr_t*attr,它用默认属性值初始化attr指向的线程属性对象。为了不定义结构中char arry的值,在创建POSIX线程时使用了未初始化的pthread_attr_t对象。如果将NULL作为pthread_create的attr参数传递,则会使用默认属性创建线程

这应该可以解决这个问题

pthread_create (&tids[i], NULL, runnerFunction, (void*) sValue[i]);

这应该可以解决问题

pthread_create (&tids[i], NULL, runnerFunction, (void*) sValue[i]);

至少对于调试来说,始终检查系统调用的返回值是一个好主意

因此,请按如下方式修改代码:

typedef union
{
  char __size[__SIZEOF_PTHREAD_ATTR_T];
  long int __align;
} pthread_attr_t;
for (i = 0; i < numThreads; ++i)
{ 
  int result = pthread_create (&(tids[i]), &attr, runnerFunction, &sValue[i]);
  if (0 != result)
  {
    fprintf(stderr, ("pthread_create() failed with error #%d: '%s'\n", result, strerror(result));
    exit(EXIT_FAILURE);
  }
}
这有助于发现bug


由于您的代码在传递attr时似乎不起作用,因此该错误可能是由于没有正确初始化attr造成的。有关如何初始化phtread属性的详细信息,请参阅。

至少对于调试,最好始终检查系统调用的返回值

因此,请按如下方式修改代码:

typedef union
{
  char __size[__SIZEOF_PTHREAD_ATTR_T];
  long int __align;
} pthread_attr_t;
for (i = 0; i < numThreads; ++i)
{ 
  int result = pthread_create (&(tids[i]), &attr, runnerFunction, &sValue[i]);
  if (0 != result)
  {
    fprintf(stderr, ("pthread_create() failed with error #%d: '%s'\n", result, strerror(result));
    exit(EXIT_FAILURE);
  }
}
这有助于发现bug


由于您的代码在传递attr时似乎不起作用,因此该错误可能是由于没有正确初始化attr造成的。有关如何初始化phtread属性的详细信息,请参阅。

检查pthread函数的返回值如何?请尝试pthread_create&tids[i]、NULL、runnerFunction、void*sValue[i]@阿伦莫齐,这就是修复它的原因。我可以问一下为什么这样做有效而pthread_attr不起作用吗?如果在create调用中使用attr,那么它也应该在join调用中使用。检查pthread函数的返回值怎么样?试试pthread_create&tids[I],NULL,runnerFunction,void*sValue[I]@阿伦莫齐,这就是修复它的原因。我可以问一下为什么这样做有效而pthread_attr不起作用吗?如果在create调用中使用attr,那么在join调用中也应该使用attr