我有这个代码:
int main(int argc, char** argv)
{
pthread_t thread[thr_num];
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
// just for debugging //
struct rlimit rlim;
getrlimit(RLIMIT_NPROC, &rlim);
printf ("soft = %d \n", rlim.rlim_cur);
printf ("hard = %d \n", rlim.rlim_max);
////
for ( i = 1 ; i <= thr_num ; i++) {
if(pthread_create( &thread[i], &attr, loggerThread, (void*)argv ) ) {
printf("pthread_create failure, i = %d, errno = %d \n", i, errno);
exit(1);
}
}
pthread_attr_destroy(&attr);
for ( i = 1 ; i <= thr_num ; i++) {
if( pthread_join(thread[i], (void**)&status ) ) {
exit(1);
}
}
return 0;
}
void* loggerThread(void* data)
{
char** sthg = ((char**)data);
pthread_exit(NULL);
}
我不明白为什么当我使用 thr_num=291 运行此代码时,出现错误:pthread_create failure, i = 291, errno = 11 (EAGAIN)
thr_num=290 工作正常。我在 Linux 2.6.27.54-0.2-default (SLES 11) 上运行此代码 rlim.rlim_cur 的值也为 6906 rlim.rlim_max。我在“最大用户进程”中看到的“ulimit -a”相同。我还检查了 pthread_create 手册页指导的 /proc/sys/kernel/threads-max (它是 13813)。也没有为“sysctl -a”输出找到任何值为 290 的参数。
偶尔我从这个链接中发现: pthread_create and EAGAIN 说:“即使调用了 pthread_exit 或 pthread_cancel,父进程仍然需要调用 pthread_join 来释放 pthread ID,然后它将变为可回收”
所以只是作为一个尝试,我将我的代码修改为:
for ( i = 1 ; i <= thr_num ; i++) {
if(pthread_create( &thread[i], &attr, loggerThread, (void*)argv ) ) {
printf("pthread_create failure, i = %d, errno = %d \n", i, errno);
exit(1);
}
if( pthread_join(thread[i], (void**)&status ) ) {
printf("pthread_join failure, i = %d, errno = %d \n", i, errno);
exit(1);
}
}
pthread_attr_destroy(&attr);
然后一切正常:我在 291 周期没有收到错误。
我想了解为什么我的原始代码会出现错误:1. 因为线程编程错误 2. 或者我遇到了一些我无法识别的系统限制
也想知道我的修正是否对这个问题有好处,或者我最终用这个解决方案引入了哪些隐藏的东西、陷阱?谢谢 !