pthread_create()没有创建线程

时间:2014-04-21 00:39:21

标签: 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], NULL);
}

有人有任何建议吗?

3 个答案:

答案 0 :(得分:2)

在我的机器上(suse 11),pthread_attr_t的定义如下:

typedef union
{
  char __size[__SIZEOF_PTHREAD_ATTR_T];
  long int __align;
} pthread_attr_t;

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

答案 1 :(得分:1)

这应解决问题

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

答案 2 :(得分:1)

至少在调试时,最好始终检查系统调用的返回值。

所以修改你的代码如下:

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);
  }
}

这有助于发现错误。

由于您的代码在传递attr时似乎无效,因此错误可能是由于没有正确初始化attr。有关如何初始化phtread属性的详情,请参阅pthread_att_init()