一、线程与进程
1.进程:是一个具有一定独立功能的程序的一次运行活动,进程是程序执行时的一个实例,同时也是资源分配的最小单元;
Linux中的进程包含:(1)“数据段”存放的是全局变量、常数以及动态数据分配的数据空间;
(2)“代码段”存放的是程序代码的数据。
(3)“堆栈段”存放的是子程序的返回地址、子程序的参数以及程序的局部变量等。
2.线程:是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
多任务,并发的工作方式。
3.进程与线程的关系:
一个进程由几个线程组成,线程与同属一个进程的其他的线程共享进程所拥有的全部资源。
进程(资源分配的最小单位) | 线程(程序执行的最小单位) |
进程切换占用资源,效率差 | 通信效率高 |
有独立的地址空间,健壮 | 没有独立的地址空间 (同一进程内的线程共享进程的地址空间) |
4.使用线程的优点:(1)“节俭” ,无需分配地址空间;运行于一个进程中的多个线程,它们之间使用相同的地址空间
(2)线程间彼此切换所需的时间远远小于进程间切换所需要的时间
(3)线程间方便的通信机制,一个线程的数据可以直接为其它线程所用
(4)使多CPU系统更加有效
(操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上)
(5)改善程序结构
(一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改)
二、多线程程序设计
(1)创建:
int pthread_create(pthread_t * tidp, const pthread_attr_t*attr, void*(*start_rtn)(void), void*arg)
tidp:线程id
attr: 线程属性(通常为空)
start_rtn:线程要执行的函数
arg:start_rtn的参数
(2)编译:因为pthread的库不是linux系统的库,所以在进行编译的时候要加上-lpthread
(3) 终止:(进程中任何一个线程中调用exit或_exit,那么整个进程都会终止。)
线程的正常退出方式有:(1) 线程从启动例程中返回
(2) 线程可以被另一个线程终止
(3) 线程自己调用pthread_exit函数
(4) 退出:void pthread_exit(void * rval_ptr)
(5)等待: 阻塞调用线程,直到指定的线程终止。
int pthread_join(pthread_t tid,void **rval_ptr)
tid :等待退出的线程id
rval_ptr:线程退出的返回值的指针
(6)线程同步:
线程之间对资源的竞争:
(1)互斥量Mutex:线程在取出头节点前必须要等待互斥量,如果此时有其他线程已经获得该互斥量,那么该线程 将会阻塞在这里.只有等到其他线程释放掉该互斥量后,该线程才有可能得到该互斥量。
互斥量从本质上说就是一把锁, 提供对共享资源的保护访问。
(2) 信号灯Semaphore:
(3)条件变量Conditions: