书接上文,我们讲到了线程的自动退出(自杀),在线程的函数操作里面还有他杀这种操作,下面由其他线程结束另一线程来讲解今天的内容。
线程的“他杀”函数:pthread_cancel()int pthread_cancel(pthread_t thread);
功能:- 请求结束一个线程
- thread 请求结束一个线程tid
- 成功返回0
- 失败返回-1;
int pthread_cancel(pthread_t thread);
功能:- 请求结束一个线程
- thread 请求结束一个线程tid
- 成功返回0
- 失败返回-1;
线程的回收 1.线程的回收机制:代码示例:
void *th_fun1(void *arg) { int cnt = 5; while(1) { if(cnt == 0) { pthread_exit(NULL); } cnt--; printf("in thread fun. tid1 = %lun", pthread_self()); sleep(1); } } int main(int argc, const char *argv[]) { pthread_t tid; pthread_create(&tid, NULL, th_fun1, NULL); void *retval; pthread_join(tid[0], &retval); printf("thread. tid = %lun", pthread_self()); sleep(1); return 0; }代码输入的结果为:
也可以在join()中保存次线程想要给主线程的内容
上述代码可以在pthread_join("i am dead"),在主线程中可以拿retval接收并且操作或者打印
- 不同于进程,没有孤儿进程和僵尸进程
- 主线程结束任意子线程也会结束(因为主进程结束,共享空间被回收)
- 次线程的正常结束不影响主线程的程序的进行
- 如果预估次线程在有限的范围内结束用pthread_join()来回收
- 如果预估次线程可能休眠或者阻塞则等待一段时间后被系统强制回收
- 如果次线程设定已知必须长时间运行则不再回收资源
- 可结合性:(默认)能被其他线程回收和杀死的线程具有可结合性,在没有被其他线程回收之前,其资源不释放,使用pthread_join()函数回收。(类似于僵尸进程)
- 不能被其他线程回收和杀死的线程具有分离属性,其存储资源在终止时被系统自动释放。(类似于孤儿进程)
int pthread_attr_init(pthread_attr_t *attr);
- 功能:初始化一个attr的变量
- 参数:attr,需要变量来接受初始值
- 返回值:
- 0 --->成功,
- 非0---> 错误;
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
- 功能:把一个线程设置成相应的属性
- 参数:attr,属性变量(init函数初始化创立的)
- detachstate:有2个可选值,
- PTHREAD_CREATE_JOINABLE:可结合性(可以用0来替代)
- PTHREAD_CREATE_DETACHED:设置分离属性(可以用1来替代)
int pthread_attr_destroy(pthread_attr_t *attr);
- 功能:销毁线程属性
方法2: pthread_detach (在次线程中设置)代码示例:
void *th_fun(void *arg) { while(1) { printf("in thread fun.n"); sleep(1); } } int main(int argc, const char *argv[]) { pthread_t tid; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, 1); pthread_create(&tid, &attr, th_fun, NULL); pthread_attr_destroy(&attr); while(1) { printf("in thread.n"); sleep(1); } return 0; }以上代码即可正常执行,无需关心次线程的回收以及调用,程序退出以后会被系统自动回收
int pthread_detach(pthread_t thread);
- 功能:设置分离属性
- 参数:线程id号,填自己的id
此方法在后文配合后续内容做出详细讲述
本篇文章配合上文线程(1)可以作为线程的基本使用,通过以上代码我们可以实现线程创立以及属性的设置回收和结束等等的简单并发的机制,在后文我们会详细的讲述线程的进阶,同步与异步等等的设置,谢谢大家!



