
如果代码中没有pthread_join,则主线程将快速结束,并且整个过程将结束,因此创建的线程将结束而没有机会开始执行. 加入pthread_join后,主线程将一直等待,直到等待线程完成,以便创建的线程有机会执行.
pthread_join()函数可以阻止主线程等待其他线程退出,以便主线程可以清理其他线程的环境. 但是,有些线程更喜欢自己清理退出状态,并且它们不希望主线程调用pthread_join来等待它们. 我们称这种类型的线程属性为分离(detached). 如果在调用pthread_create()函数时将属性设置为NULL,则意味着我们希望所创建的线程使用默认属性,该属性可连接(此时不分离).
pthread_cancel:

用来取消一个函数,它通常需要被取消线程的配合. 默认情况下(延迟取消),它将为pthread设置取消标志. 在许多情况下,pthread线程将检查其是否具有取消请求. 如果有,您将主动退出. 这些检查是否有取消的地方称为取消点.
当然,线程不会被其他人被动地终止. 它可以通过设置自己的属性来决定如何结束. 线程的被动终止有两种类型,一种是异步终止,另一种是同步终止. 异步终止是当其他线程调用pthread_cancel时,该线程立即终止. 同步终止不会立即终止,它将继续运行pthread kill 返回值,直到到达下一个终止点(取消点)为止. 按照默认的创建方法创建线程时,其属性为同步终止.
如果要在整个程序退出时终止每个线程,则应在成功发送CANCEL指令后使用pthread_join函数,并等待指定的线程完全退出后再继续执行;否则,很容易产生“分段错误”.
pthread_kill:

不要怕这个名字,pthread_kill不是杀死,而是向线程发送信号. 记住信号,信号的大多数默认动作是终止进程,因此我们必须使用signal()捕获信号并添加处理函数.
int pthread_kill(pthread_tthread,int sig);
Sig信号发送到具有指定ID的线程. 如果程代码中未执行任何处理,则整个过程将根据信号的默认行为受到影响,即,如果将SIGQUIT发送到线程,但该线程未实现信号处理功能,则整个过程将退出. 如果要获得正确的行为,则需要程中实现信号(SIGKILL,sig_handler).
pthread_exit:

线程可以调用pthread_exit终止自身. 有两种情况需要注意: 一种情况是在主线程中,如果从主函数返回或调用exit函数退出主线程,则整个过程将终止. 进程中的一些线程也将终止,因此您不能在主线程中过早地从主函数返回. 另一种情况: 如果主线程调用pthread_exit函数,则仅主线程将死,该进程将不会终止,该进程中的其他进程该线程将不会终止,该进程将不会终止,直到所有线程完成;
退出():
例如: exit(EXIT_SUCCESS)是进程出口. 如果程函数中调用exit,则更改线程的进程也将挂起,这将导致该进程的其他线程也挂起,这更加严重.
返回:

return是函数返回,不一定是线程函数,只有线程函数返回,线程才会退出.
比较说明:
pthread_join通常由主线程调用,并用于等待子线程退出. 由于正在等待,因此被阻止. 通常,主线程将加入依次创建的所有子线程.
pthread_exit通常是一个子线程调用pthread kill 返回值,用于结束当前线程. 子线程可以通过pthread_exit传递返回值,主线程通过pthread_join获得返回值,从而确定子线程的退出是正常还是异常.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-174792-1.html
舰载武器质量和威力也很重要
举止大方
还说什么别轻举妄动