1

我试图弄清楚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?这意味着 - 等待过程结束 - 但如果我不使用那条线,我会得到什么情况?

多谢!

4

2 回答 2

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

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

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

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

我的第二个问题是为什么需要 pthread_exit ?这意味着 - 等待过程结束 - 但如果我不使用那条线,我会得到什么情况?

pthread_exit如果其他线程仍在运行,则终止当前线程而不终止进程;相反,从返回main相当于调用exit,就标准而言,应该“终止程序”(从而隐式杀死所有线程)。

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

尽管如此,在当前版本的 libc 中,exit(因此 return from main)应该终止进程(以及它的所有线程),实际上是exit_group在 Linux 上使用系统调用。

请注意,类似的讨论适用于 Windows CRT。

于 2013-05-06T13:25:41.930 回答
-1

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

于 2019-12-01T04:11:32.227 回答