线程安全
简述
线程安全是指在多线程环境下,同一函数或函数库被不同线程调用,不会出现数据不一致的情况。另一篇博客线程安全与线程不安全,有一个小例子对比了线程安全与线程不安全。
确定一个函数不是线程安全的:
- 函数中访问全局变量或者静态变量。
- 函数中动态分配或释放堆资源。
- 函数中使用了其他线程不安全的函数。
值得注意的是线程安全一定是在多线程环境*=下,在单线程(即只有一个线程的进程)环境中并不存在这个说法。
如何确保一个函数是线程安全的:
- 对于多个线程执行的同一段代码,如果存在被改动的情况,则需要使用锁机制确保在同一时刻只有一个线程进入执行流。
- 具体加锁操作有互斥锁、条件变量、信号量以及读写锁。
具体的应用场景
针对下列两种情形,牢记 一二三法则。分别是 一个场所、两种角色、三种关系。
生产者与消费者
一个场所
双方之间有一个公共的场所,如有一个全局的循环队列或者链表等,一方负责将放入资源,一方负责取走资源。
两种角色
生产者负责将资源放入公共的场所;消费者负责从场所种取走资源。
三种关系
- 生产者与生成者之间为互斥关系 。需要保持多个生产者进程之间互斥,同一时刻只能有一个生产者线程进入生产区。
- 消费者与消费