锁
类型:互斥锁 读写锁 自旋锁
死锁:产生的4个必要条件
锁的实现:忙等待(中断的关闭与启用) 非忙等待(test-set)
线程安全
线程安全就是在多线程运行的时候,不论线程的调度顺序怎样,最终的结果都是一样的、正确的。那么就说这些线程是安全的。
1、对线程同步,保证同一时刻只有一个线程访问临界资源。
2、在多线程使用线程安全的函数(可重入函数),所谓线程安全的函数指的是:如果一个函数能被多个线程同时调用且不发生竟态条件,则我们称他是线程安全的。
看这样一个代码
1 |
|
他的结果是这样的,并没有出现预想的结果,不符合线程安全的前提。
原因是strtok这个方法用的是全局栈区的地址,应该改成局部栈区的地址。
1 |
|
不能保证线程安全的函数
线程与fork
多线程中有一个线程调用fork创建子进程,子进程中会有几个线程?
写个代码测试一下
1 |
|
总结:在多线程中一个线程调用fork创建子进程,创建的子进程中只有调用fork的线程被启动,其他线程并没有执行。
线程与锁
多线程创建子进程,并且在创建之前有对互斥锁加锁,子进程中锁的状态如何?
改下上面的代码
1 |
|
没有出现子进程的加锁和解锁,所以在子进程出现了死锁现象,子进程会继承父进程的锁的状态。
那怎么解决死锁问题呢
1 | 线程库 |
改进代码
1 |
|