摘要:线程是如何创建的,线程之间的通信是如何做到的,线程之间通信需要注意什么,线程的同步与互斥是如何使用临界资源的,今天,又是我们一起努力学习的一天,一起来看看。
什么是线程,昨天我们学习了进程,说到每个进程的地址空间都是相互独立的,每个进程都有一个stask_struck。在进行进程切换时,需要不断地刷新cache缓存,比较消耗资源,为了减少这种消耗,就引入了轻量级的进程----线程。
线程的特点:同一个进程创建的多个线程共用同一个进程的地址空间。当进程创建线程后,原本的进程也叫做线程,成为主线程。
那么线程又是如何创建的?我们先来看一下创建线程的函数:
#include <pthread.h>
int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine)(void *),void *arg);
乍一看,这个函数如此复杂,竟然有四个参数。没关系,我们一个一个的来看。
① thread 这个参数代表着线程对象,每个线程对应一个线程对象。
在使用之前得先定义出来,看它类型,可以看出是pthread_t 类型的。
② attr 这是线程属性,默认填缺省属性NULL。
③ void *(*start_routine)(void *) 这个东西看起来复杂,其实就是填函数名,线程用一个函数去封装,所以填的这个函数名就是我们线程的入口。
④ arg 这个是填需要往线程里传递的参数。一次只能传递一个参数,想要传递多个参数的话,可以先定义一个结构体,传递结构体名,不想传递参数就填NULL。
从函数中可以看出返回值是int 类型的,创建线程成功返回0,失败则返回1,可用于判断线程是否创建成功。
和进程一样,有创建自然就有结束线程和等待线程。先来看结束线程的函数:
#include <pthread.h>
void pthread_exit(void *reatval);
就reatval 一个参数,这个参数填的是线程结束时返回的信息,由等待线程函数接收,若不想返回信息,可填NULL。
等待线程:就是主线程需要进行的操作,因为线程是共用主线程的同一片地址空间,所以假如主线程先结束,那么子线程也随即结束。所以要想主线程在子线程后面结束就必须有这个等待函数 函数如下:
#include <pthread.h>
int pthread_join(pthread_t