多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激发状态,从而让多个函数的操作同时运行。为了实现多线程,则必须绕开栈的限制,需要为这个线程建一个新的栈,每个栈对应一个线程。当某个栈执行到全部弹出时,对应线程完成任务并结束。所以,多线程的进程在内存中有多个栈,多个栈之间以一定的空白区域隔开,以备栈的增长。每个线程可调用自己栈下最下方的帧中的参数和变量,并与其它线程共享内存中的Text,heap和global data区域。
pthread_create用于创建一个线程。
pthread_join函数用来等待一个线程的结束。
pthread_exit函数用来结束一个线程,和pthread_join的区别是:pthread_join一般是主线程调用,用来等待子线程退出,因为是等待,所以是阻塞的,一般主线程会依次添加所有它创建的子线程。pthread_exit是子线程调用,用来结束当前线程。
多线程同步:同步是指在一定的时间内只允许某一个线程访问某个资源。在此时间内,不允许其他线程访问该资源。可以通过互斥锁(mutex),条件变量(condition variable),读写锁(reader-writer lock)和信号量来同步资源。
互斥锁:是一个特殊的变量,有锁上和打开两个状态,锁变量一般设置为全局变量,打开的互斥锁可以由某个线程获得。一旦获得,这个互斥锁会锁上,此后只有该线程有权打开,其他想要获得互斥锁的线程,会等待互斥锁再次打开的时候。
条件变量原理:当线程在等待满足条件时使线程进入睡眠状态,一旦条件满足,就唤醒因等待满足特定条件而睡眠的线程。
条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补互斥锁的不足,常和互斥锁一起使用。使用时,条件变量用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其他的某个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程,这些线程将重新锁定互斥锁并重新测试条件是否满足。
创建有静态和动态两种方式,静态通过PTHREAD_COND_INITILIZER常量。动态使用pthread_cond_init函数。注销用pthread_cond_destory()函数。等待有两种方式pthread_cond_wait()和pthread_cond_timedwait()。激发用两种方式pthread_cond_signal()(激活一个等待线程)和pthread_cond_broadcast()(激活所有等待线程)。
读写锁从对文件的读写操作中引申出来的。读写锁比互斥锁有更高的实用性与并行性,可以有多个线程同时占用读模式的读写锁,但只能有一个线程占用写模式的读写锁。读写锁最适合于对数据结构的读操作次数多于写操作次数的场合。因为读模式锁定时可以共享,但写模式锁定时只能由一个线程独占资源。
信号量:与互斥锁的区别是,互斥锁只允许一个线程进入临界区,而信号量允许多个线程同时进入临界区。