- 什么是线程?
进程是运行中的程序,多个进程实现了操作系统的并发;多个线程实现了进程的并发,是操作系统进行计算和调度的基本单位,进程有多个线程以完成不同的任务。同一进程下的多个线程共享内存空间和文件描述符等,所以线程之间通信要比进程通信方便的多,但是线程也有自己的独立空间,比如线程栈,它是其他线程不能访问的,线程栈从进程堆上分配内存,通过 ulimit -a可以查看线程栈大小为8M,为了防止其他线程践踏自己的线程栈,操作系统为栈后面分配一段缓冲区,一旦踏入这个缓冲区,就会引发段错误。 - 线程如何创建
首先这些函数包含在#include <pthread.h>中 定义一个线程号 pthread_t tid; 创建一个线程,并传入线程函数 pthread_create(&tid,NULL,func,arg); arg是传给线程函数的参数,创建成功就会返回0,失败返回-1,至于什么时候执行看操作系统的调度。 func函数类型是 void *func(void*); 主线程等待子线程执行完毕可以使用下面的函数 pthread_join(pid,NULL); 该函数一直阻塞知道子线程执行完毕 主线程还可以将子线程分离 pthread_detach(tid); 子线程执行完毕应该回收它的资源,如果主线程执行完毕,子线程还在执行,那么这个线程就会变成僵尸县好吃呢个,中断输入 ps -ef 可以查看僵尸线程 线程的退出方式有三种: return pthread_exit()终止自己 通过其他线程调用pthread_cancel终止
- 线程之间同步的方式
有互斥量,条件变量,信号量
互斥锁:同一时刻只允许一个线程访问资源;
条件锁:只有条件发生时,线程才能访问资源,这样不用一直等待资源;
信号量:mutex=1时线程才能访问资源,semaphore=p>0时,表示可以允许p个线程访问资源,小于等于0表示不能有线程访问资源;