下一节传送门https://blog.csdn.net/qq_37120369/article/details/101164870
一、首先我们来认识线程
在讲线程前我们先提一下进程,进程是系统中程序执行和资源分配的基本单位。
线程则是进程内独立的一条运行路线,是处理器调度的最小单位,也称轻量级进程,在一个进程中的多个执行路线就叫做线程。
要注意的是,由于线程共享了进程的资源和地址空间,因此,任何线程对系统共享资源的操作都会给其他线程带来影响,所以线程的同步很重要了。
编写线程程序最主要的是要考虑同步与互斥问题。
linux下多线程遵从POSIX接口,编写时源文件时需要包含头文件pthread.h,编译时需要连接库文件libpthread.a ,
即编译时带上-lpthread的选项
二、linux线程的基本函数
1. 函数pthread_create用于创建一个新线程
参数详解:
thread 用来表明创建线程的ID,如果线程创建成功则通过这个指针返回
attr 指明线程创建时的属性,NULL表示默认属性
start_routine 函数指针,指向线程创建成功后开始执行的函数
arg 传递给start_routine所指函数的唯一参数
返回值:
成功返回 0;错误返回出错码
2. 线程的退出
先介绍一下 线程退出有俩种方式,其一,在线程函数结尾用return或者自行运行完线程函数,线程函数自然结束,这是最常见的方法。其二,通过函数pthread_exit退出线程。
参数详解:
retval 线程返回值
返回值:
退出当前线程返回retval,父线程或其他线程可以通过pthread_join获取它
3. 等待线程退出函数
该函数的作用是悬挂当前线程,直到线程编号为thread(函数参数)的线程被终止结束,类似waitpid函数。
当一个线程调用了pthread_exit函数时,其他线程或进程使用pthread_join等待该线程结束,那么线程的ID和退出状态会一直保留到pthread_join执行时。pthread_exit函数设定的返回值(retval)、或者线程函数return的返回值可以被pthread_join函数的参数(thread_return)捕获。
参数详解:
thread:被等待的线程ID
thread_return:用户定义的指针,用来存储被等待线程返回值
返回值:
成功返回0;错误返回-1
参考程序
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#define RUN_TIME 5
//定义线程函数
void * thread(void * arg)
{
int i;
int no=(int)arg;
for(i=0;i<RUN_TIME;i++)
{
printf("This is a pthread %d\n",no);
sleep(1);
}
}
int main(void)
{
pthread_t id;
int i,ret;
//创建线程
ret=pthread_create(&id,NULL,(void *) thread,(void *)1);
if(ret!=0){
printf("Create pthread error!\n");
exit(1);
}
for(i=0;i<RUN_TIME;i++)
{
printf("This is the main process.\n");
sleep(1);
}
//等待线程退出
pthread_join(id,NULL);
return (0);
}
编译及执行过程如下:
出现警告时由于在线程函数中对传进的参数做了强制转换
补充:程序的主进程默认为主线程。主线程退出(例如main函数里的exit),它的子线程无论是否执行完成,都会随着主线程消失而消失。所以,一般在主函数里必须判断子线程是否真正退出(否则容易出现程序结果不正确),最常用的方法就是使用pthread_join等待子线程退出。