Multithreading pthread_create()不创建线程
我正在处理一个多线程程序,但由于某些原因,我无法创建线程。当我尝试调试时,它在pthread_join语句处中断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],
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