栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Linux详解--(2)线程的基础

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux详解--(2)线程的基础

书接上文,我们讲到了线程的自动退出(自杀),在线程的函数操作里面还有他杀这种操作,下面由其他线程结束另一线程来讲解今天的内容。

线程的“他杀”函数:pthread_cancel()

int pthread_cancel(pthread_t thread);

功能:
  • 请求结束一个线程
参数:
  • thread 请求结束一个线程tid
返回值:
  • 成功返回0
  • 失败返回-1;

线程的资源回收:pthread_join()

int pthread_cancel(pthread_t thread);

功能:
  • 请求结束一个线程
参数:
  • thread 请求结束一个线程tid
返回值:
  • 成功返回0
  • 失败返回-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接收并且操作或者打印

线程的回收 1.线程的回收机制:
  • 不同于进程,没有孤儿进程和僵尸进程
  • 主线程结束任意子线程也会结束(因为主进程结束,共享空间被回收)
  • 次线程的正常结束不影响主线程的程序的进行
2.次线程的回收机制:
  • 如果预估次线程在有限的范围内结束用pthread_join()来回收
  • 如果预估次线程可能休眠或者阻塞则等待一段时间后被系统强制回收
  • 如果次线程设定已知必须长时间运行则不再回收资源
线程的属性
  1. 可结合性:(默认)能被其他线程回收和杀死的线程具有可结合性,在没有被其他线程回收之前,其资源不释放,使用pthread_join()函数回收。(类似于僵尸进程)
  2. 不能被其他线程回收和杀死的线程具有分离属性,其存储资源在终止时被系统自动释放。(类似于孤儿进程)
线程属性的设置 方法1: pthread_attr_init

int pthread_attr_init(pthread_attr_t *attr);

  • 功能:初始化一个attr的变量
  • 参数:attr,需要变量来接受初始值
  • 返回值:
    • 0 --->成功,
    • 非0---> 错误;
pthread_attr_setdetachstate

int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

  • 功能:把一个线程设置成相应的属性
  • 参数:attr,属性变量(init函数初始化创立的)
  •     detachstate:有2个可选值,
    • PTHREAD_CREATE_JOINABLE:可结合性(可以用0来替代)    
    • PTHREAD_CREATE_DETACHED:设置分离属性(可以用1来替代)
pthread_attr_destroy

int pthread_attr_destroy(pthread_attr_t *attr);

  •  功能:销毁线程属性 

代码示例:

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;
}

以上代码即可正常执行,无需关心次线程的回收以及调用,程序退出以后会被系统自动回收

方法2: pthread_detach                (在次线程中设置)

int pthread_detach(pthread_t thread);

  • 功能:设置分离属性
  • 参数:线程id号,填自己的id

此方法在后文配合后续内容做出详细讲述

本篇文章配合上文线程(1)可以作为线程的基本使用,通过以上代码我们可以实现线程创立以及属性的设置回收和结束等等的简单并发的机制,在后文我们会详细的讲述线程的进阶,同步与异步等等的设置,谢谢大家!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1034988.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号