pthread 创建的线程,默认不会在线程结束的时候,主动释放资源,最后造成pthread_create创建线程失败。
pthread_create返回值为11 ,errno为12 。
例如下面的代码,如果我们运行一段时间,创建线程就会报错。
pthread_t ReadThreadHandle;
static void * usbReadThread( void *para )
{
int i;
int k;
for(i=0;i<100;i++)
{
k+=i;
}
sleep(1);
return NULL;
}
int main(int argc, char *argv[])
{
int ret;
int count =0;
while(1)
{
ret = pthread_create(&(ReadThreadHandle),NULL,usbReadThread,NULL);
if(ret)
{
ReadThreadHandle = 0;
printf("create thread failed count =%d errno=%d\n",count,errno);
sleep(10) ;
}
else
{
printf("1create thread sucess %d\n",count);
}
count++;
}
return 0;
}
原来pthread创建的线程有两种状态, joinable 和 detached 两种状态。
如果是joinable状态,线程结束的时候不会自动释放资源必须在调用pthread_join等待线程结束的时候才会释放线程的资源。线程创建的默认状态就是joinable。
所以针对上面的问题,我们把代码修改成
pthread_t ReadThreadHandle;
static void * usbReadThread( void *para )
{
int i;
int k;
for(i=0;i<100;i++)
{
k+=i;
}
sleep(1);
return NULL;
}
int main(int argc, char *argv[])
{
int ret;
int count =0;
while(1)
{
ret = pthread_create(&(ReadThreadHandle),NULL,usbReadThread,NULL);
if(ret)
{
ReadThreadHandle = 0;
printf("create thread failed count =%d errno=%d\n",count,errno);
sleep(10) ;
}
else
{
pthread_join(ReadThreadHandle,NULL);
printf("1create thread sucess %d\n",count);
}
count++;
}
return 0;
}
在测试就不会出现线程创建不成功的问题了。
但是可能在某些情况下我们不想调用pthread_join等待线程终止,那么我们也可以将线程设置为detached状态。这是线程结束的时候,就会自动释放线程的资源。
但是如果设置为detached状态,就不能用pthread_join等待线程结束。这时即使线程还在跑,pthread_join也会马上返回。
设置为detached状态我们可以在线程中调用pthread_detach(pthread_self()) ;
下面是示例代码
pthread_t ReadThreadHandle;
static void * usbReadThread( void *para )
{
int i;
int k;
pthread_detach(pthread_self()) ;
for(i=0;i<100;i++)
{
k+=i;
}
sleep(1);
return NULL;
}
int main(int argc, char *argv[])
{
int ret;
int count =0;
while(1)
{
ret = pthread_create(&(ReadThreadHandle),NULL,usbReadThread,NULL);
if(ret)
{
ReadThreadHandle = 0;
printf("create thread failed count =%d errno=%d\n",count,errno);
sleep(10) ;
}
else
{
printf("1create thread sucess %d\n",count);
}
count++;
}
return 0;
}
运行上面的代码,也不会出现创建线程出错的现象。
pthread_create返回值为11 ,errno为12 。
例如下面的代码,如果我们运行一段时间,创建线程就会报错。
pthread_t ReadThreadHandle;
static void * usbReadThread( void *para )
{
int i;
int k;
for(i=0;i<100;i++)
{
k+=i;
}
sleep(1);
return NULL;
}
int main(int argc, char *argv[])
{
int ret;
int count =0;
while(1)
{
ret = pthread_create(&(ReadThreadHandle),NULL,usbReadThread,NULL);
if(ret)
{
ReadThreadHandle = 0;
printf("create thread failed count =%d errno=%d\n",count,errno);
sleep(10) ;
}
else
{
printf("1create thread sucess %d\n",count);
}
count++;
}
return 0;
}
原来pthread创建的线程有两种状态, joinable 和 detached 两种状态。
如果是joinable状态,线程结束的时候不会自动释放资源必须在调用pthread_join等待线程结束的时候才会释放线程的资源。线程创建的默认状态就是joinable。
所以针对上面的问题,我们把代码修改成
pthread_t ReadThreadHandle;
static void * usbReadThread( void *para )
{
int i;
int k;
for(i=0;i<100;i++)
{
k+=i;
}
sleep(1);
return NULL;
}
int main(int argc, char *argv[])
{
int ret;
int count =0;
while(1)
{
ret = pthread_create(&(ReadThreadHandle),NULL,usbReadThread,NULL);
if(ret)
{
ReadThreadHandle = 0;
printf("create thread failed count =%d errno=%d\n",count,errno);
sleep(10) ;
}
else
{
pthread_join(ReadThreadHandle,NULL);
printf("1create thread sucess %d\n",count);
}
count++;
}
return 0;
}
在测试就不会出现线程创建不成功的问题了。
但是可能在某些情况下我们不想调用pthread_join等待线程终止,那么我们也可以将线程设置为detached状态。这是线程结束的时候,就会自动释放线程的资源。
但是如果设置为detached状态,就不能用pthread_join等待线程结束。这时即使线程还在跑,pthread_join也会马上返回。
设置为detached状态我们可以在线程中调用pthread_detach(pthread_self()) ;
下面是示例代码
pthread_t ReadThreadHandle;
static void * usbReadThread( void *para )
{
int i;
int k;
pthread_detach(pthread_self()) ;
for(i=0;i<100;i++)
{
k+=i;
}
sleep(1);
return NULL;
}
int main(int argc, char *argv[])
{
int ret;
int count =0;
while(1)
{
ret = pthread_create(&(ReadThreadHandle),NULL,usbReadThread,NULL);
if(ret)
{
ReadThreadHandle = 0;
printf("create thread failed count =%d errno=%d\n",count,errno);
sleep(10) ;
}
else
{
printf("1create thread sucess %d\n",count);
}
count++;
}
return 0;
}
运行上面的代码,也不会出现创建线程出错的现象。