1.线程是一个轻量化的进程,包括创建、调度、回收的整个过程。
2.线程的创建:线程被创建后独享8M栈区,共享进程中的文本段、数据段和堆区。
3.线程的调度:宏观并行,微观串行
4.线程的回收:线程执行结束后,回收线程空间,避免产生僵尸线程
5.线程和进程的区别:
进程是系统资源分配的最小单元
线程是CPU任务调度的最小单元
6.多线程和多进程的对比:
执行效率:多线程>多进程
通信效率:多线程>多进程
安全性:多进程>多线程
通信复杂度:多进程>多线程
7.线程的创建
pthread_create
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
功能:
在进程空间创建一个线程
参数:
thread:存放线程ID的首地址
attr:线程的属性空间首地址(默认传NULL)
start_routine:线程要执行的函数的地址
arg:对线程函数传递的参数
返回值:
成功返回0
失败返回非0
注意:
编译时需要加-lpthread链接线程库
gcc filename.c -lpthread
8.pthread_exit
void pthread_exit(void *retval(默认NULL))
功能:线程退出
参数:
retval:线程退出时的值
返回值:缺省
9.pthread_join
int pthread_join(pthread_t thread, void *retval(默认NULL))
功能:线程回收
参数:
thread:回收线程的ID
retval:存放线程结束值的空间首地址
返回值:
成功返回0;
失败返回非0;
注意:pthread_join具有阻塞功能,线程不结束会一直阻塞等待
pthread_join具有同步功能
10.互斥锁
1.引入互斥锁解决资源竞争的问题
2.在操作资源前上锁,在操作资源后解锁
3.函数接口:
1.pthread_mutex_init
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr)
功能:初始化互斥锁
参数:
mutex:互斥锁空间首地址
attr:互斥锁属性,默认传递NULL
2.pthread_mutex_destroy
int pthrread_mutex_destroy(pthread_mutex_t *mutex)
功能:销毁互斥锁
参数:
mutex:互斥锁空间首地址
3.pthread_mutex_lock
int pthread_mutex_lock(pthread_mutex_t *mutex)
功能:互斥锁上锁
4.pthread_mutex_unlock
int pthread_mutex_unlock(pthread_mutex_t *mutex)
功能:互斥锁解锁
11.死锁
1.多线程通信由于加锁问题导致多任务均无法向下执行的状态称为死锁
2.死锁产生的4个必要条件:
1.互斥条件
2.不可剥夺条件
3.请求保持
4.循环等待
3.避免产生死锁
1.多线程任务加锁顺序保持一致
2.pthread_mutex_trylock替换pthread_mutex_lock
12.线程任务同步
1.信号量:
是一种资源,可以被申请、释放、初始化
释放:让资源数+1,不会阻塞
申请:让资源数-1,如果当前资源数为0,申请资源时会阻塞等待,直到资源不为0,才能继续向下执行
2.函数接口
1.sem_init
int sem_init(sem_t *sem, int pshared, unsigned int value)
功能:信号量的初始化
参数:
sem:信号量空间首地址
pshared:
0:线程使用
非0:进程使用
value:
信号量初始化的值
返回值:
成功返回0
失败返回-1
2.sem_destroy
int sem_destroy(sem_t *sem)
功能:信号量的销毁
3.sem_wait
int sem_wait(sem_t *sem)
功能:信号量资源申请
4.sem_post
int sem_post(sem_t *sem)
功能:信号量资源释放