进程——
资源分配的最小单位,线程——
程序执行的最小单位。线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的线程共享进程所拥有的全部资源。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。
线程有自己的堆栈和局部变量,但线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以
多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,
效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
为什么使用多线程?与进程相比,它更加节约资源,不需要分配地址空间。运行于一个进程中的多个线程,它们之间使用相同的地址空间,而且线程间彼此切换所需的时间也远远小于进程间切换所需要的时间;线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过进程间通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便;
创建线程
#include
int pthread_create(pthread_t * tidp,const pthread_attr_t*attr,void*(*start_rtn)(void),void*arg)
tidp:线程id
attr: 线程属性(通常为空)
start_rtn:线程要执行的函数
arg:执行函数需要的的参数退出线程
int pthread_join(pthread_t tid,void **rval_ptr)
如果进程中任何一个线程中调用exit或_exit,那么整个进程都会终止。线程的正常退出方式有:
(1) 线程从启动例程中返回
(2) 线程可以被另一个线程终止
(3) 线程自己调用pthread_exit函数
#include
void pthread_exit(void * rval_ptr)//
线程等待
void *status;
pthread_join(pthread_t tid, &status);//阻塞调用进程,直到指定的线程终止
取消线程
Pthread_cancel(pthread_t tid);//取消指定线程号的线程
获取自己的线程号
pthread-self();//返回该进程的进程号 pthread_t tid;
当多个线程同时访问同一个共享资源时,由线程1处理过的节点再由线程2来处理时,万一节点被释放,那后果就会很糟糕!为了防止这个现象,可以引入
互斥量这一概念。线程在取出头节点前必须要等待互斥量,如果此时有其他线程已经获得该互斥量,那么该线程将会阻塞在这里.只有等到其他线程释放掉该互斥量后,该线程才有可能得到该互斥量。互斥量从本质上说就是一把锁, 提供对共享资源的保护访问。创建互斥量
pthread_t mutex;
pthread_mutex_init(&mutex, NULL);//初始化互斥量
对共享资源的访问, 要使用互斥量进行加锁, 如果互斥量已经上了锁, 调用线程会阻塞, 直到互斥量被解锁。
pthread_mutex_lock(&mutex);//加锁
pthread_mutex_unlock(&mutex);//上锁
在操作完成后,必须给互斥量解锁,也就是前面所说的释放。这样其他等待该锁的线程才有机会获得该锁,否则其他线程将会永远阻塞。释放互斥量
pthread_mutex_destroy(&mutex);//释放互斥量