使用局部变量作为参数的pthread_create

时间:2013-09-04 13:39:00

标签: c++ pthreads posix local-variables

当我以下列方式使用pthread_create时会导致错误吗?

void myFunction(){
  thread_t myThread;
  pthread_create(&myThread,0,myRoutine,0);
}

我不确定局部变量myThread的使用是否会导致错误,因为myFunction()退出时它不再存在。

当函数退出时,内核中是否仍然可以使用myThread的内存?

我不需要存储在myThread中的线程ID,所以我不想分配内存并再次释放它。

3 个答案:

答案 0 :(得分:3)

你不应该让一个线程“完成”,因为这肯定会导致问题。如果你希望线程刚刚完成就赢了,你应该至少使用pthread_detach,此时线程完全是“独立的”,应该可以保留它。

答案 1 :(得分:2)

  

当我以下列方式使用pthread_create时,是否会导致错误?

是的:您现在无法在完成时加入该线程。这是资源泄漏,类似于丢失指向已分配内存的唯一指针。

如果您真的不想以受控方式关闭它,那么您可以致电pthread_detach让它负责整理自己的资源;然后你可以放心地放弃线程句柄。

  

当函数退出时,内核中是否仍然可以使用myThread的内存?

没有。 pthread_t只是用于访问线程资源的句柄。它不管理这些资源,除非您需要访问它们,否则它不需要存在。

答案 2 :(得分:2)

您还可以在创建PTHREAD_CREATE_DETACHED时将其作为线程属性的一部分传递。这样,您不必担心以后加入该线程。像这样:

 pthread_t;
 int status;
 pthread_attr_t attr;

 status = pthread_attr_init(&attr);
 if (status != 0) {
     fprintf(stderr, "pthread_attr_init() failed [status: %d]\n", status);
     return 0;
 }

 status = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
 if (status != 0) {
     fprintf(stderr, "pthread_attr_setdetachstate() failed [status: %d]\n", status);
     return 0;
 }

 status = pthread_create(&t, &attr, myRoutine, 0);