线程&进程
进程是资源分配的最小单位,线程是程序执行的最小单位。
进程是一个程序的一个实例,拥有自己独立的各种段(数据段,代码段等等),每次创建一个进程需要从操作系统分配这些资源给他,消耗一定的时间,在linux下C语言创建一个进程使用fork()
函数;
线程是一个轻量级的进程,除了自己少数的资源,不用用其他资源,且一个进程可以创建多个线程,这些线程共享进程的资源,创建线程的时间要比创建进程少很多,从函数角度是使用clone()
创建。
使用线程处理文件I/O或者socket处理都是非常有优势的,将一个大任务分解成若干个小任务,每个线程处理一个任务,线程之间切换不需要花很多时间,而且线程之间数据交换很方便,共享存储区。
多线程相关的函数
线程创建函数
函数原型定义:
1 2 |
int pthread_create(pthread_t * tid, const pthread_attr_t * attr, void * ( * func) (void * ), void * arg); |
其返回值是一个整数,若创建进程成功返回0,否则,返回其他错误代码。
参数含义:
线程变量名
:pthread_t *
类型,是标示线程的id,一般是unsigned long类型,这里也可以是引用类型,目的是用于返回创建线程的ID;
线程的属性指针
:制定线程的属性,比如线程优先级,初始栈大小等,通常情况使用NULL;
创建线程的程序代码
:一般是函数指针,进程创建后执行该函数指针指向的函数;
程序代码的参数
:若线程执行的函数包含由若干个参数,需要将这些参数封装成结构体,并传递它的指针;没有传递参数的使用NULL。
返回当前线程ID函数
函数原型定义:
1 2 |
pthread_t pthread_self (void); |
用于返回当前线程的ID。
线程等待结束函数
函数原型定义:
1 2 |
int pthread_join (pthread_t tid, void ** retval); |
这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。成功返回0,否则返回错误的编号。
参数含义:
第一个参数表示要等待的进程的id;
第二参数表示要等待的进程的返回状态,是一个用户定义的指针,用来存储被等待线程的返回值,是个二级指针;不需要返回值可以使用NULL
线程结束函数
函数原型定义:
1 2 |
void pthread_exit (void *retval); |
参数是指针类型,用于存储线程结束后返回状态。如果参数不是NULL,这个返回值会直接送到pthread_join(pthread_t tid, void ** retval)
函数中的返回值中。
pthread_exit
和pthread_join
的区别
pthread_join
和pthread_join
两个函数都有结束线程的作用,但是又有很大区别:
pthread_join
一般来是主线程来调用,用来等待子线程退出,因为是等待,所以是阻塞的自,一般主线程会依次join所有它创建的子线程。
pthread_join
一般是子线程调用,用来结束当度前线程。子线程可以通过pthread_exit
传递一个返知回值,而主线程通过pthread_join
获得该返回值,从而判断该子线程的退出是道正常还是异常。
Reference:
对于C语言中有多线程的情况,使用gcc编译需要加上多线程编译选项。
发现有两个多线程的编译选项,一个是 -pthread;一个是 -lpthread。
但是使用 -lpthread的时候要注意应该把这个编译选项放到源文件之后,不然会报错;而 -pthread选项没有位置要求。
参考:https://bbs.linmao.dev/?thread-49.htm
关于pthread_join函数第二个参数void**类型想得不是很明白,mark一下
博主,你的博客用的哪家的服务器。
aliyun international
博主你好,今晚我们下馆子不?
现在才看到,啥时候能再下顿馆子啊…