线程与进程区别
1、进程独占内存空间,线程共享内存空间
2、通信,进程间的数据相互独立,线程间数据共享,通信时,不需要通过操作系统
3、进程的调度切换速度慢,线程的速度快<共享地址空间>
二者之间的关系
管家和马仔的关系,马仔主要干活;管家分配金钱。
同理,进程拥有资源,线程是执行的最小单位。
雇佣多个管家干活,效率低、还浪费资源;因此提倡使用多线程。
目的
1、节约资源
2、提高效率
线程
1、创建
pthread_create()//创建线程 man pthread_create
pthread_join();//主线程等待子线程结束
pthread_exit();//线程退出
pthread_self();//获取线程id
//函数也好理解,跟进程的创建、父子进程等待都差不多
2、创建大量线程时,需要使用循环的方式来创建线程,线程主要根据线程id来区分
由于线程之间共享资源,线程并发执行且之间抢占资源导致出现的结果杂乱无章,引进同步机制,如互斥锁、条件变量、读写锁
互斥锁
加锁和解锁会成对出现
pthread_mutex_t mutex; //互斥量
pthread_mutex_init();//初始化
//动态初始化时,需要destroy(),如new delete一样
pthread_mutex_destory();//摧毁
pthread_mutex_lock();//加锁
pthead_mutex_unlock();//解锁
pthread_mutex_trylock();//加锁是否成功,利用返回值判断
互斥量与信号量
互斥量是通过锁机制来实现线程的同步;信号量是通过数值来实现进程同步。
产生死锁的原因:
1、线程持有锁资源死亡
2、一个互斥量尝试两次加锁
解决方法:
条件变量
理解:
当某个条件成立时,则从阻塞的位置开始执行
pthread_cond_wait();//阻塞等待,并且释放互斥量资源
pthread_cond_signal();//加锁,唤醒阻塞
pthread_cond_timedwait();//定时等待
pthread_cond_broadcast();//广播唤醒
代码
总结
1、加锁和解锁用于共享内存,且成对出现
2、锁机制会出现,死锁情况解决方法
2.1、利用条件变量 pthread_cond_wait()
作用:1、等待阻塞 2、释放互斥量<等待阻塞队列,根据条件变量来唤醒>
2.2、利用pthread_cond_signal()
作用:1、加锁机制 2、唤醒等待阻塞的位置,执行