大丙 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相关的值

参考

大丙博客