什么叫线程?(多线程则是通过第三方库来实现的)
就是引入了在一个进程中有多个任务,每个任务有自己的私有空间,也有共用的共享空间,把任务也按照进程一样进行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后进程结束。
从上例看出,线程就是另外的函数,让进程拥有同时执行多个任务功能。