我正在尝试使用此示例代码来计算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 */
我有两件事我不太确定:
当我们使用pthread_create时 - 我正在传递'a'参数的地址,
但这个参数是否被“保存”在PrintVar函数的“arg”下?
例如,如果我使用:PrintVar(void *blabla)
,并希望从main函数传递2个参数:int a = 10, int b= 20
..我该怎么做?
为什么需要pthread_exit?这意味着 - 等待进程结束 - 但是如果我不使用该行,我可以获得什么样的情况呢?
非常感谢!
答案 0 :(得分:4)
- 当我们使用pthread_create时 - 我传递'a'参数的地址,但这个参数是否被“保存”在PrintVar函数的“arg”下?
醇>
“原始”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)终止时终止线程(或者等效地,如果 主线程返回)。