我正在开发一个多线程程序但由于某种原因我无法创建我的线程。当我尝试调试时,它会破坏我的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);
}
有人有任何建议吗?
答案 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()
。