线程间通信指针问题

线程间通信指针问题

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);

void pthread_exit(void *retval);
int pthread_join(pthread_t thread, void **retval);

主进程传给子进程一级指针就可以实现
但是子进程传给主进程需要借用二级指针。
想知道这样设计是有意为之,还是其他原因?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
山行老师 2022-11-10 14:32:50
重新解释一下,第4行函数pthread_join( )是去拿子进程的退出信息,子线程的退出信息是一块内存XX,pthread_join( )需要获取这一块内存的首地址,所以需要让一个指针去指向XX,修改指针的指向要传递这个指针的地址。
  • 提问者 我想跑路 #1

    那使用一级指针直接拷贝整个内存中的内容不是也可以吗? 

    就像主线程传给子线程不就是通过这种方式吗?

    2022-11-10 15:23:25
  • 慕数据5202135 回复 提问者 我想跑路 #2

    仔细品味,主线程给子线程传递,子线程用void *接收完就能用了,但是子线程返回的void *是在自己的线程函数中,如果你有办法直接用这个一级指针当然就不用二级指针了,但是实际上最终是通过pthread_join的第二个参数(输出参数)把子线程返回的void *赋值带回的,你在外边得通过定义一个一级指针用来接收子线程返回地址,因此pthread_join函数第二个参数如果继续使用一级指针接收外边定义的一级指针并在内部把这个形参接收到的一级指针改成子线程返回的地址,pthread_join函数执行完,第二个形参对应的一级指针的修改并没有反映到外部的一级指针,所以你得使用二级指针接收外部一级指针的地址并使用间接引用改成子线程返回得一级指针地址。关键点就是子线程设计接收主线程的参数是使用一级指针,子线程返回给主线程也是一级指针,但是返回的过程经历了pthread_join这个函数中转(也是必须的,毕竟是操作系统实现的),因此pthread_join函数需要使用二级指针接收。

    2022-12-23 10:22:22
  • 慕数据5202135 回复 提问者 我想跑路 #3

    补充一下,如果想用一级指针那可以通过函数返回值满足你的想法,但是这边的设计是通过pthread_join输出参数带回的,那就必须得通过二级指针了

    2022-12-23 10:32:28
山行老师 2022-11-07 21:33:22

有原因的,这个问题需要站在主线程的角度理解。
1)主线程需要告知子线程执行什么函数【也就是任务】;
2)主线程需要拿到子线程的退出信息【任务执行结果】;
所以创建子线程的时候,函数pthread_create() 第3参数是一个指向线程需要执行的函数;

而等待子线程结束时,结束信息又必须返回给主线程,这个时候主线程需要一个指针去指向这个退出信息,而修改指针的指向就需要使用二级指针;

所以pthread_join()需要使用二级指针作为形参。

  • 提问者 我想跑路 #1

    我想说的是 pthread_create() 通过第四个参数一级指针传递数据给子线程执行函数的,但是子线程传递参数给主线程却不是。

    修改指针的指向就需要使用二级指针;这句话也不太理解

    2022-11-07 22:27:17
  • 主线程给子线程传参,由于接口设计者不知道你会传各种类型,所以干脆给了void*类型,需要开发者在子线程中再转成传的时候类型;
    子线程的退出信息,是主线程调用函数pthread_join( )去获取,函数获取一段内存的首地址除了返回内存首地址,就只能修改形参指针的指向,pthread_join( )用的就是后者。
    反过来说,如果用一级指针void *ptr作函数pthread_join( )形参,函数pthread_join( )内部可以让ptr指向退出信息,那函数pthread_join( )返回,还有指针指向退出信息么?没有,所以需要二级指针。

    2022-11-08 14:34:29
  • 提问者 我想跑路 回复 山行老师 #3

    还是不太明白,那主线程传子线程只用一级指针,是因为pthread_create()第四个参数传参和第三个线程执行函数是在都是通过pthread_create函数绑定的,但是子线程传给主线程,是分别通过pthread_exit和pthread_join,pthread_exit传入一级指针做参数,将信息存储在一级指针的指向,所以pthread_join为了获得这个一级指针只能通过自己传入一个二级指针,将上面一级指针的地址通过二级指针来指向?

    2022-11-10 09:05:25
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师