线程安全 与 重入问题

目录

一、概念阐述

1、线程安全

2、重入

二、常见情况分析

1、常见线程不安全的情况

1. 不保护共享变量的函数

2. 函数状态随着被调用而发生变化的函数

3. 返回指向静态变量指针的函数

4. 调用线程不安全函数的函数

2、常见线程安全的情况

1. 每个线程对全局变量或者静态变量只有读取权限,而没有写入权限

2. 类或者接口对于线程来说都是原子操作

3. 多个线程之间的切换不会导致该接口的执行结果存在二义性

3、常见不可重入的情况

1. 调用了 malloc/free 函数

2. 调用了标准 I/O 库函数

3. 可重入函数体内使用了静态的数据结构

4、常见可重入的情况

1. 不使用全局变量或静态变量

2. 不使用 malloc 或者 new 开辟出的空间

3. 不调用不可重入函数

4. 不返回静态或全局数据,所有数据都由函数的调用者提供

5. 使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据

三、结论与关系辨析

1、结论

2、可重入与线程安全的联系

1. 可重入函数通常是线程安全的

2. 不可重入函数可能引发线程安全问题

3. 涉及全局变量的函数通常既非线程安全也非可重入

3、可重入与线程安全的区别

1. 包含关系(线程安全函数包含可重入函数)

2. 侧重点不同

3. 锁的影响

4、注意事项

1. 特殊重入情况的考虑

2. 明确概念侧重点

四、STL、智能指针与线程安全

1、STL中的容器是否是线程安全的?

2、智能指针是否是线程安全的?

(1) std::unique_ptr

(2) std::shared_ptr

(3) std::weak_ptr


一、概念阐述

1、线程安全

  • 线程安全是一个在多线程编程环境中至关重要的概念。

  • 它指的是当多个线程同时访问共享资源时,程序能够正确地执行,各个线程之间不会相互干扰,也不会破坏彼此的执行结果。

  • 从代码层面来看,当多个线程并发执行同一段仅包含局部变量的代码时,由于局部变量具有线程私有的特性,每个线程都有自己独立的一份局部变量副本,因此通常不会出现不同的执行结果。

  • 然而,当代码涉及对全局变量或者静态变量进行操作,并且没有采取适当的锁保护机制时,就极容易出现线程安全问题。

    </
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值