一、线程
线程---轻量级的进程---侧重于作为一个CPU调度执行的基本单位。
进程---重量级的进程---侧重于作为一个资源分配的基本单位。
进程VS线程
1---线程要共享进程资源
2---线程要依附于进程
3---一个进程可以拥有多个线程
4---一个进程至少有一个线程

线程的生命周期:
1.创建---- pthread_create
2.运行
3.结束
4.资源回收
二、创建一个线程
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
功能:创建一个线程
参数:@thread :线程id
@attr :属性线程属性(可结性 可分离属性-----资源回收)默认NULL可结合属性
@start_routine :线程的回调函数/执行函数
@arg :这是给线程执行函数传递的参数(int float char 数组 struct)
返回值:成功:返回0;失败:返回错误码。
添加编译选项
-pthread,在编译命令中显式链接pthread库。//返回值void*NULL
//形参void *接收arg这个参数的
void * start_routine(void *arg)
注意:1.线程特点共享进程的数据很方便全局局部
2.问题共享数据方便,但是数据间相互影响也大
3.线程创建后原先主函数所在执行流,称为主线程;其他称为子线程或次线程
4.线程间地位是对等的
5.创建好后,线程的执行顺序是不确定;由操作系统调度决定
cs
#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
void * do_sth(void *arg)
{
int i = *(int *)arg;
while(1)
{
printf("hello thread ... i = %d\n",i);
i++;
}
}
int main(int argc, const char *argv[])
{
pthread_t tid;
int t = 0;
int ret = pthread_create(&tid,NULL,do_sth,&t);
if(ret != 0)
{
errno = ret;
perror("pthread_create is fail");
return -1;
}
printf("tid = %ld\n",tid);
sleep(1);
return 0;
}
三、进程执行退出
#include <pthread.h>
void pthread_exit(void*retval);
相当于进程中exit;用在主函数中表示结束主线程(主线程执行流结束了,但是进程的空间还在,直达所有的子线程结束,才会最终销毁--不是结束进程
pthread_join 来获取
Itreturnsfromstart_routineO(线程执行函数)
pthread_cancel(3)---取消函数---效果类似于进程中发信号//kill -9
线程结束方式:1.pthreadexit
2.线程函数return//等价于方式1
3.pthreadcancel
4.exit或成主函数返回