1. 线程的基本概念
线程:
在一个程序中的多个执行路线就叫做线程(thread)。更准确的说,线程是一个进程内部的一个控制序列。
为了理解线程,先回顾一下进程的概念:
进程包括程序映像、地址空间等要素。内核使用PCB来管理进程。进程是内核进行调度的基本单元,每个独立的进程都有自己的代码段、数据段以及堆栈,它们使用自己的虚拟地址空间,多个进程间互不影响。
与进程相比,线程没有自己独立的地址空间,创建出来的新线程将和创建它的进程(或线程)共享一个虚拟地址空间,它们被置于同一个线程组中。线程的代码段、全局数据段、堆及其他一些诸如文件描述符等内核管理的东西都在同一组内是共享的,但每个线程都有自己独立的栈空间。
线程的优点:
使程序看起来同时在做两件事情。
可以将混杂着输入、计算和输出的应用程序,分离为3个线程来执行。
对资源的需求小。
一般而言,线程之间的切换需要操作系统做的工作要比进程之间的切换少得多。
*
编译:因为pthread的库不是linux系统的库,所以在进行编译的时候要加上 -lpthread
gcc filename -lpthre
终止线程:
如果进程中任何一个线程中调用exit或_exit,那么整个进程都会终止。线程的正常退出方式有:
(1) 线程从启动例程中返回
(2) 线程可以被另一个进程终止
(3) 线程自己调用pthread_exit函数
#include <pthread.h>
void pthread_exit(void * rval_ptr)
功能:终止调用线程
Rval_ptr:线程退出返回值的指针
线程等待:
#include <pthread.h>
int pthread_join(pthread_t tid,void **rval_ptr)
功能:阻塞调用线程,直到指定的线程终止。
Tid :等待退出的线程id
Rval_ptr:线程退出的返回值的指针
线程同步:
1 互斥量Mutex
2 信号灯Semaphore
3 条件变量Conditions
互斥量:
系统给我们提供了互斥 量.线程在取出头节点前必须要等待互斥量,如果此时有其他线程已经获得该互斥量,那么该线程将会阻塞在这里.只有等到其他线程释放掉该互斥量后,该线程才有可能得到该互斥量。互斥量从本质上说就是一把锁, 提供对共享资源的保护访问。
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t 、*mutex,const pthread_mutexattr_t *attr)
int pthread_mutex_destroy(pthread_mutex_t *mutex)
加锁:
对共享资源的访问, 要使用互斥量进行加锁, 如果互斥量已经上了锁, 调用线程会阻塞, 直到互斥量被解锁。
int pthread_mutex_lock(pthread_mutex_t *mutex)
int pthread_mutex_trylock(pthread_mutex_t *mutex)
返回值: 成功则返回0, 出错则返回错误编号。
trylock是非阻塞调用模式, 如果互斥量没被锁住, trylock函数将对互斥量加锁, 并获得对共享资源的访问权限; 如果互斥量被锁住了,trylock函数将不会阻塞等待而直接返回EBUSY, 表示共享资源处于忙状态。
解锁:
在操作完成后,必须给互斥量解锁,也就是前面所说的释放。这样其他等待该锁的线程才有机会获得该锁,否则其他线程将会永远阻塞。
int pthread_mutex_unlock(pthread_mutex_t *mutex)