大丙 linux C/C++多线程和线程同步
1 多线程/进程
- 多线程与多进程编程,都可以提高程序的并发性,多线程对于系统资源的消耗更加少一点,那么多线程与多进程的区别是什么?可以多个线程共享一个进程的虚拟地址空间
- 进程的虚拟地址空间,这里每一个线程都有自己的栈与寄存器,寄存器资源由内核管理
- 要启动多个应用程序的时候,才会去用多进程,不然一般并发就是使用多线程
2 子线程的创建
- 在进程中,创建了一个子线程,那么原来的进程就变成了主线程,一般情况下,主线程退出了,子线程也会退出,当然也可以做到主线程退出,但是子线程不退出
- 每一个线程有一个线程id,
pthread_t
类型(底层是unsigned long)
3 线程退出函数
- 可以做到主线程主动退出,但是释放虚拟地址空间,
pthread_exit(NULL)
线程回收
- 子线程的内核区资源需要主线程来释放,主线程中调用
pthread_join
函数,如果指定的子线程在运行,该函数就阻塞,一个join回收一个子线程
4 线程分离函数
- 父子线程分离之后,子线程的资源就不需要父线程去回收了,但是,在父线程退出之后,子线程仍然不能运行,分离之后的子线程,由别的线程来回收,这个是由内核调度的
- 分离的目的是,不想要主线程一直被join阻塞
5 其他线程函数
- ptread_cancel就是kill,不会立即杀死指定线程,但是会在指定线程陷入内核之后(比如系统调用),指定线程会被杀死,类似xv6中的kill
- pthread_euqual用来比较线程号,而且可以解决兼容性问题
6 线程同步
7 8 9 互斥锁操作
10 线程死锁
11 读写锁
- 读写锁是一把??,可以做两件事情,
pthread_rwlock_t
12 读写??函数
13 读写??线程同步
14 15 条件变量
- 条件变量比起??,其可以使得多个线程接触阻塞,但是需要和??配合使用
pthread_cond_timewait
的第三个参数是一个strcut,也就是线程阻塞的等待时间是tv_sec + tv_nsec
pthread_cond_ssignal
唤醒单一线程,pthread_cond_broadcast
唤醒全部阻塞在该cond的线程- 条件变量是用来阻塞线程的,也就是可以达到多个线程同时进入临界区的效果
17 18 信号量处理线程同步
sem_wait
函数每次调用就会减少相关sem的值,减少为0的时候,就阻塞线程;sem_post
就是反过来,给相关sem的值加1;sem_getvalue
函数用来获取当前sem相关的值
参考
大丙博客