线程的了解

一、基础了解 

进程的产生  ----- fork

线程 --- 轻量级的进程  进程 --- 重量级的进程 

线程 成为 CPU执行的最小单位 ,进程 成为 资源分配的基本单位 

线程 创建 和 调度 时空开销都比进程小   

线程组成:线程tid //thread ,程序计数器 ,寄存器集合,栈 

线程与进程的关系:线程 是 存在于 进程中的 

                                 线程 共享了进程的资源 (代码段,数据段,打开一些文件,信号等)

                                 线程结束,不一定导致进程结束 

线程的编程 :类似与进程过程 

二、线程的创建

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

功能:该函数可以创建指定的一个线程。

参数:thread     线程id,需要实现定义并由该函数返回。

           attr   线程属性,一般是NULL,表示默认属性。(可结合性+分离属性),默认(可结合性) -- 自己手动回收,分离属性 -- 系统自动回收 
          start_routine  线程执行函数 (线程回调函数),指向[指针函数的] 函数指针。本质上是一个函数的名称即可。称为th 回调函数,是线程的执行空间。

注: 线程回调函数 --完成线程任务功能的函数 ,需要调用者 自己实现

           arg  回调函数的参数,即参数3的指针函数参数。

返回值:成功 0,失败 错误码 

注:  主函数所在的执行流 --- 主线程 

      其它的线程   ---  子线程(次线程)   

      各个线程间 地位是平等           

获得线程tid:pthread_self(); //在那个线程中调用,获得的就是那个线程的tid 

#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>

void * do_something(void *arg)
{
   //线程的任务函数 
   printf("------do_something ---- \n");
}


int main(int argc, const char *argv[])
{
	pthread_t tid;
	int ret = pthread_create(&tid,NULL,do_something,NULL);

	if (ret != 0)
	{
		errno = ret;
		perror("pthread_create fail");
		return -1;
	}

	sleep(3);
	return 0;
}

三、线程的执行

线程的执行   --- 就体现在线程的 执行函数(回调函数)上

四、线程的退出

pthread_exit 

void pthread_exit(void *retval)

功能:结束调用的线程 

参数:  retval  退出状态值,传的是退出状态值 对应的地址,也可默认为NULL。

注意:   pthread_exit 本身表示结束线程 

            如果用在main函数中 表示结束主线程 

            主线程结束 并不表示进程,此时,主线程执行流结束,进程会在其余线程都结束后,结束 

五、线程的资源回收

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

功能:等待线程结束 

参数:   thread  --- 线程tid  

           retval  --- 用来保存,退出状态值,所在空间的地址 

返回值:成功 0,失败 错误码 

注:  线程退出时,可以带出退出状态值,

       但是传的是,退出状态值对应空间的地址

#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>

void * do_something(void *arg)
{
	static int a = 10;
	//线程的任务函数 
	printf("------do_something ---- \n");
	pthread_exit(&a);
	//pthread_exit((void *)a);
}

int main(int argc, const char *argv[])
{
	pthread_t tid;
	int ret = pthread_create(&tid,NULL,do_something,NULL);

	if (ret != 0)
	{
		errno = ret;
		perror("pthread_create fail");
		return -1;
	}

	//sleep(3);
   void *retval; 
	//pthread_join(tid,&retval);
	pthread_join(tid,&retval);


	printf("---- main----%d\n",*(int *)retval);
//	printf("---- main----%d\n",(int)retval);

	pthread_exit(NULL);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值