线程的基本概念以及实现

什么叫线程?(多线程则是通过第三方库来实现的

        就是引入了在一个进程中有多个任务,每个任务有自己的私有空间,也有共用的共享空间,把任务也按照进程一样进行cpu系统调度,是一种轻量级的进程,就叫做线程。

        在进程中创建线程,而线程则依附于进程,只是多个线程和多个进程一样同时执行(我的理解就是相当于一个实时的操作系统,而这些进程就是不同任务,通过时间片进行执行)。

在进程当中,线程可以共享以下的内容:

线程共享内容
1、可执行的指令

2、静态数据(长时间不会变化的数据)

3、在进程中打开的文件描述符

4、信号的处理函数

5、进程号
6、当前工作目录
7、用户id
8、用户组id

线程私有资源
1、tid线程id
2、程序计数器
3、堆栈(局部变量、堆空间变量)
4、执行状态

了解了线程,那么如何进程线程的操作呢?

通过第三方提供的线程函数库进行操作:

1、创建线程

#include <pthread.h>

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

参数1:指针地址,新线程的id
参数2:创建线程的属性
参数3:创建的新线程从这里开始
参数4:将这个参数传给参数3函数用

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

2、等待进程结束,回收线程资源

#include <pthread.h>

void pthread_join(pthread_t thread, void **retval)

参数1:线程id,等待对应的线程

参数2:线程结束的结束状态为一级指针,要存储线程结束的结束状 态,把结束状态存储到这个地址(二级指针)对应的空间中

3、结束指定进程

#include <pthread.h>

int pthread_cancel(pthread_t thread)

参数1:要结束的线程的id

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

知道这些函数就可以开始写我们的线程了,下面进行一个示例来稳固以下知识:

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

void sum2()    //计算101到200的和
{
	int sum = 0;
	for(int i = 101;i <= 200;i++)
	{
		if(i == 120)
		{
			pthread_exit("error");//结束线程
		}
		sum += i;	
		printf("sum2 = %d\n",sum);
		sleep(1);
	}
}

void * thread1(void * arg)//新线程的起始函数,新线程从这个函数开始执行
{
	printf("%s\n",(char * )arg);
	sum2();//创建的新线程执行的内容

	return "ok";//线程的结束状态,起始函数结束,线程就结束
}

int main()
{
	pthread_t tid1;
	pthread_create(&tid1,NULL,thread1,"hello");//把线程id设置到tid1中,NULL表示默认熟悉创建,线程从thread1开始执行
	sleep(10);
	printf("wait\n");
	pthread_cancel(tid1);//取消线程执行,用join去等待结束,没有结束状态
	void * val;
	if( pthread_join(tid1,&val) != 0)
		printf("error\n");
	return 0;
}

当这个程序编译运行过后,他先打印sum2函数结果,在10S后进程结束。

从上例看出,线程就是另外的函数,让进程拥有同时执行多个任务功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啵啵520520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值