对于多线程编程,我仍然是新手,我不太明白为什么只在线程被调用时才使用pthread_cleanup_push和pthread_cleanup_pop,而调用pthread_exit()不需要清理。为什么?
发布于 2022-10-17 16:46:45
线程取消清理处理程序( pthread_cleanup_push/pthread_cleanup_pop管理的)的目的是在取消时对线程使用的用户定义的数据和结构进行清理。因为取消通常是一种异常的终止方法,所以当线程被取消时,您可以注册处理程序来“清理”,因为线程在被终止之前无法完成。
例如,假设在A和B之间共享了一个互斥锁,线程A获得锁,然后在有机会释放它之前被取消。然后线程B尝试获取锁,但是会无限期地被卡住,因为锁永远不会(也永远不会)由A释放,为了避免这一点,使用线程取消清理处理程序,您可以确保当A被取消时,互斥锁被释放。
在正常情况下,例如线程中的return或pthread_exit(),假设不需要这样的清理过程,因为线程本身决定何时退出,并且在退出之前完全控制该做什么,因此任何清理都可以很容易地执行。
注意到,但是对pthread_exit()的调用仍然会导致清理处理程序运行。这是因为线程使用的其他函数可以调用pthread_exit(),这些函数可能是您可以控制的,也可能是您无法控制的(我认为这是一种不常见的情况,但仍然如此)。
https://stackoverflow.com/questions/74100179
复制相似问题