本文仅作为学习记录,非商业用途,侵删,如需转载需作者同意。
一、为什么要有线程
进程默认有一个主线程。
线程负责执行二进制指令,根据指令一行行执行下去。
进程管理的范围更大,除了指令,还包内存,文件系统等。
进程相当于一个项目;
线程是为了完成项目需求,而建立的一个个开发任务。
使用进程实现并行执行的问题有:
1、创建进程占用资源太多
2、进程之间的通信需要数据在不同的内存空间传来传去,无法共享
Linux中,前台任务和后台任务分开。
有些任务需要马上返回结果,例如输入一个字符
有些任务可以默默执行的,例如数据同步。
两个任务应该在不同的线程处理,相互不耽误。
二、如何创建线程
没看明白。。。。
三、线程的数据
线程访问的数据细分成三类:
3.1、线程栈上的本地数据
例如:函数执行过程中的局部变量
ulimit -a 查看栈大小,默认8192(8MB)
ulimit -s 修改
主线程在内存中有栈空间,其他线程也有独立的栈空间。
为了避免线程之间的栈空间踩踏,线程栈之间还会有小块区域,用来隔离保护各自的栈空间。
另一个线程踏入到这个隔离区,就会引发段错误。
3.2、整个进程里共享的全局数据
例如:全局变量。 同一个进程中共享,不同的进程是隔离的。
3.3、线程私有数据
四、数据的保护
4.1、Mutex
全称 Mutual Exclusion,中文叫互斥:
访问共享数据时,申请加把锁,谁先拿到锁谁就拿到了访问权限,其他人在门外等着,等这个人访问结束把锁打开,其他人再去争夺,还是遵循谁先拿到谁访问。
具体过程:
使用Mutex,首先使用 pthread_mutex_init 函数初始化这个mutex,初始化后可以用它来保护共享变量了。
pthread_mutex_lock() 就是去抢那把锁的函数,如果抢到了,就可以执行下一程序,对共享变量进行访问,如果没抢到,不会被阻塞,而是返回一个错误码。
当共享数据访问结束了,别忘了使用 pthread_mutex_unlock释放锁,让给其他人使用。最终调用 pthread_mutex_destroy 销毁掉这把锁。
条件变量
使用 pthread_mutex_lock(),需要一直在那里等着;
如果是pthread_mutex_trylock(),就不用等着干点别的。
没事就让大家歇着,有事了就去通知,别让人家没事就来问问,浪费大家时间:这就是条件变量
条件变量和互斥锁配合使用:
当接到了通知来操作共享资源的时候,还是需要抢互斥锁,因为可能很多人都收到了通知,都来访问了。