为什么使用pthread_exit?

时间:2013-05-06 13:18:01

标签: c multithreading unix pthreads

我正在尝试使用此示例代码来计算pthread_exit的用法:

void* PrintVar(void* arg)
 { 
   int * a = (int *) arg; // we can access memory of a!!!
    printf( "%d\n", *a); 
 } 

int main(int argc, char*argv[]) 
 { 
   int a, rc;
    a = 10; 
   pthread_t thr; 
   pthread_create( &thr, NULL, PrintVar, &a ); 

  //why do I need it here?//
  pthread_exit(&rc); /* process continues until last  
                                threads termintates */

我有两件事我不太确定:

  1. 当我们使用pthread_create时 - 我正在传递'a'参数的地址, 但这个参数是否被“保存”在PrintVar函数的“arg”下? 例如,如果我使用:PrintVar(void *blabla),并希望从main函数传递2个参数:int a = 10, int b= 20 ..我该怎么做?

  2. 为什么需要pthread_exit?这意味着 - 等待进程结束 - 但是如果我不使用该行,我可以获得什么样的情况呢?

  3. 非常感谢!

2 个答案:

答案 0 :(得分:4)

  
      
  1. 当我们使用pthread_create时 - 我传递'a'参数的地址,但这个参数是否被“保存”在PrintVar函数的“arg”下?
  2.   

“原始”a(在main中定义的那个)没有被复制,你只是传递指向它的指针。

  

例如,如果我正在使用:PrintVar(void * blabla),并希望从main函数传递2个参数:int a = 10,int b = 20 ..我该怎么做?

将这两个值放在struct中,并将指针传递给pthread_create的参数这样的结构(PrintVar,因此,将接收这样的指针,并且能够检索这两个值)。

  

我的第二个问题是为什么需要pthread_exit?它意味着 - 等待进程结束 - 但是如果我不使用那条线,我可以获得什么样的情况呢?

如果其他线程仍在运行,

pthread_exit将终止当前线程而不终止进程;相反,从main返回相当于调用exit,就标准而言,它应该“终止程序”(因此隐式地杀死所有线程)。

现在,作为C标准线程不可知(直到C11)并支持各种Unix中的线程一个相对较新的添加,取决于libc / kernel /任何版本exit可能会也可能不会杀死当前线程或所有线程。

仍然,在当前版本的libc中,exit(因此从main返回)应该终止进程(以及它的所有线程),实际上在Linux上使用syscall exit_group

请注意,similar discussion适用于Windows CRT。

答案 1 :(得分:-1)

detached属性仅确定线程终止时系统的行为;它不是        防止在进程使用exit(3)终止时终止线程(或者等效地,如果        主线程返回)。