学习的B站up主“爱编程的大丙”(https://subingwen.cn/linux/thread/)
关于LinuxC语言线程库。总结一下昨天学的内容。
首先是进程线程的概念,进程是系统资源分配的最小单位,而线程是CPU调用的最小单位;进程有自己独立的一块内存空间,多个线程可以共享这一个进程的空间(类似一个宿舍的舍友),并且每个线程有自己单独的空间(每个人有自己的床位),线程同时共享进程的全局区、代码区、堆区(宿舍的公共区域)。
并发与并行的概念:
有一副生动的图来自up主网页的教程,很好理解并区分这两个概念(如下图)
并发:即多个线程同一个时间段轮流抢占CPU的时间片,因为硬件资源只有一个;
并行parallel:多个线程在不同的CPU核上同时运行,真正的parallel。
C语言的线程函数库的使用:
#include<thread.h>
pthread_t pthread_self(void); //获取当前线程的Id
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
//创建线程,第一个传线程id,第二传属性,第三个传线程函数的指针,第四个传函数的参数
注意编译时要加上线程动态库
$gcc pthread_create.c -lpthread
注意,线程创建后,在没有干扰的情况下,主线程的生命周期结束,子线程也会被回收。为了子线程完整地执行,可以在主线程中加sleep()函数挂起。
void pthread_exit(void *retval);
//线程退出函数,只要调用该函数当前线程就马上退出了,并且不会影响到其他线程的正常运行,不管是在子线程或者主线程中都可以使用。
//有一个void*返回值用于join函数接收
int pthread_join(pthread_t thread, void **retval);
//阻塞函数,用于等待子线程退出,进行资源的回收
//类似于进程的wait()
//第二个参数为一个指针的地址,用于传出pthread_exit()的返回值